每次更新/更改属性时,为了使dom元素与模型上的属性值保持同步(使用john resig的简单继承http://ejohn.org/blog/simple-javascript-inheritance/),我需要触发一个事件。这是可能的以跨浏览器的方式吗?在我看来,如果我可以包装js用来设置属性的任何函数,并使它发生事件,它可以工作,我只是不知道如何做到这一点。javascript属性更改事件
回答
JavaScript不使用函数来设置属性。它们只是变量,并且设置它们不需要任何复杂的包装。
您可以用一个函数来设置该属性,虽然 - 同一类你可能在类中支持私有数据的语言使用的getter/setter安排。这样你的函数可以很容易地运行其他已经注册为回调的函数。使用jQuery你甚至可以把它们作为事件来处理。
$(yourObject).bind('some-event-you-made-up', function() {
// This code will run whenever some-event-you-made-up is triggered on yourObject
});
// ...
$(yourObject).trigger('some-event-you-made-up');
也许你已经解决了使用jQuery绑定/触发你的问题,但我想告诉大家,我建立一个更改跟踪和(在此之上)实体建模的JavaScript框架,命名为“帐篷”,解决了你曝光,而无需对对象操作,其开源任何特殊语法和托管的问题:
https://github.com/benjamine/tent
它的记录与JSDoc和单位用JS测试驱动器测试。
您可以使用更改跟踪模块是这样的:
var myobject = { name: 'john', age: 34 };
// add a change handler that shows changes on alert dialogs
tent.changes.bind(myobject, function(change) {
alert('myobject property '+change.data.propertyName+' changed!');
});
myobject.name = 'charly'; // gets notified on an alert dialog
它与阵也发生了变化(添加,删除)。 此外,您可以使用“实体”上下文来保持所有检测到的更改(添加,删除,修改项目)的集合上的变更集,级联添加和删除,保持反向属性同步,跟踪1对1, N和N对-M的关系,等等。
这是一个非常有趣的框架。 – 2013-06-23 19:34:04
你可以尝试Javascript Property Events (jpe.js)
我遇到过类似的问题,并最终编写Object.defineProperty,增加了事件处理程序的属性过载功能。它还提供了类型检查(js-base-types)并在内部存储它的值,以防止不必要的更改。
样品正常defineProperty的:
Object.defineProperty(document, "property", {
get:function(){return myProperty},
set:function(value){myProperty = value},
})
var myProperty = false;
的财产样品与onchange事件:
Object.defineProperty(document, "property", {
default:false,
get:function(){},
set:function(value){},
onchange:function(event){console.info(event)}
})
我很震惊地在那里看到一个“onchange”事件,但后来我看到它是一个框架哈哈 – 2017-07-22 04:04:56
对象defineProperty /的DefineProperties的伎俩。 这里有一个简单的代码。我已经建立了一些数据,根据该绑定框架,它可以变得很复杂,但行使这样的:
var oScope = {
$privateScope:{},
notify:function(sPropertyPath){
console.log(sPropertyPath,"changed");
}
};
Object.defineProperties(oScope,{
myPropertyA:{
get:function(){
return oScope.$privateScope.myPropertyA
},
set:function(oValue){
oScope.$privateScope.myPropertyA = oValue;
oScope.notify("myPropertyA");
}
}
});
oScope.myPropertyA = "Some Value";
//console will log: myPropertyA changed
- 1. Flex组件属性更改事件
- 2. 应用属性更改事件
- 3. 如何更改事件的json属性?
- 4. 更改事件的抓取属性Jquery
- 5. FileSystemWatcher - 更改只读属性的事件
- 6. “尝试”属性更改事件
- 7. 更改时附加事件到属性
- 8. 订阅属性更改的事件
- 9. Doctrine2 - 属性更改触发事件(PropertyChangeListener)
- 10. javascript:使用ajax更改onClick属性不会触发新事件?
- 11. 在JavaScript事件期间如何阻止元素更改(属性)?
- 12. Javascript - 如何更改组件的属性?
- 13. JavaScript:更改HTML属性
- 14. 用javascript更改html属性
- 15. Javascript特定属性更改
- 16. JavaScript:倾听属性更改?
- 17. 从Javascript更改CSS属性
- 18. 如何让属性更改事件在其子属性更改时触发?
- 19. JavaScript MouseMove事件属性
- 20. 属性更改事件WPF原始更改
- 21. 附属物更改事件?
- 22. 为什么附属属性更改事件只发一次?
- 23. 更改属性文件
- 24. 更改控件属性
- 25. 订阅属性更改事件以更新TextBlock的样式
- 26. 更改属性
- 27. 更改属性
- 28. 更改属性
- 29. 更改属性
- 30. 更改属性
它实际上是可能的,这对于在对象属性“getter”和“二传手”的作用Mozilla扩展的Javascript。 – Pointy 2010-11-12 22:44:38
或在ECMAScript 5中。 – casablanca 2010-11-12 22:53:29
问题是我想监听事件的对象不是一个jquery对象,而只是一个存储在jquery对象数据对象中的通用对象。我不知道如何将事件绑定到它。 – joshontheweb 2010-11-12 23:09:22