【发布时间】:2012-05-28 17:11:51
【问题描述】:
我有一个包含自定义 jQuery 事件处理程序的远程 javascript 文件。当它作为 <script src='...'></script> 元素插入 DOM 时,自定义事件处理程序未注册。
但是,如果我添加与直接 JS (<script>...</script>) 完全相同的脚本,则会注册事件处理程序,并且一切都会按预期执行。
当脚本作为远程文件插入时,为什么事件处理程序没有绑定到 jQuery 中?
示例
远程文件,包含自定义事件处理程序:
console.log('Before custom event handler');
$('button').on('customEvent', function(){
console.log('customEvent Caught');
});
https://gist.github.com/2767385
将脚本插入 DOM 的 (non-working) javascript:
var scriptNode = document.createElement('script');
scriptNode.src = 'https://gist.github.com/raw/2767385/b9ddea612ff60b334bd2430e59903174e527a3b5/gistfile1.js';
document.body.appendChild(scriptNode);
将脚本作为内联插入 DOM 的(工作替代)javascript:
var scriptText = "console.log('Before custom event handler'); $('button').on('customEvent', function(){ console.log('customEvent Caught'); });",
scriptNode = document.createElement('script');
scriptNode.appendChild(document.createTextNode(scriptText));
document.body.appendChild(scriptNode);
触发事件:
$('button').triggerHandler('customEvent');
JS被正确读取,handler被正确执行。
JSFiddles
远程文件 - 非工作示例:http://jsfiddle.net/3CfFM/3/
使用文本 - 工作替代:http://jsfiddle.net/3CfFM/2/
发生了什么?
当脚本作为远程文件插入时,为什么事件处理程序没有绑定到 jQuery 中?
【问题讨论】:
标签: javascript events jquery dom-manipulation