我正在尝试在IE8上触发自定义事件,并从这里和这里中找到解决方案。但我无法使其工作...
我正在使用jquery mobile与requireJS和google analytics。因此,我正在跟踪JQM pageshow
事件。然而,由于requireJS异步加载脚本,我的绑定需要在javascript“包装器”中进行,否则它会产生错误,因为在解析片段时,既没有加载jquery也没有加载jquery mobile。
所以我在每个页面的末尾包含了这个:
if (document.addEventListener) {
document.addEventListener("jqmReady",function(){trigAnalytics("jqmReady");alert("FF detected")},false);
} else if ( document.attachEvent ) {
document.attachEvent("jqmReady", function(){trigAnalytics("jqmReady");alert("IE detected")});
}
当检测到时,我将使用pageshow绑定触发我的分析代码片段:
var trigAnalytics = function( trigger ){
$(document).on('pageshow','div:jqmData(role="page").basePage', function (event, ui) {
var url = location.href;
try {
hash = location.hash;
if (hash && hash.length > 1) {
_gaq.push(['_trackPageview', hash.substr(1)]);
_gaq.push(['_setCustomVar', 1, 'id_external', ########, 1 ]);
} else {
_gaq.push(['_trackPageview', url]);
_gaq.push(['_setCustomVar', 1, 'id_external', ########, , 1 ]);
_gaq.push(['b._trackPageview', url]);
}
} catch(err) { }
});
if (typeof _gaq !== "undefined" && _gaq !== null) {
$(document).ajaxSend(function(event, xhr, settings){
_gaq.push(['_trackPageview', settings.url]);
_gaq.push(['b._trackPageview', settings.url]);
});
}
};
为了启动事件链,当JQM准备就绪时,我需要触发jqmReady
。 JQM使用他们的mobileinit
事件来指示这一点。因此,在我的应用程序控制器初始化中,我像这样绑定它:
$(document).bind("mobileinit", function () {
// non-IE OK
if (document.createEvent) {
evt = document.createEvent("Event");
evt.initEvent("jqmReady", true, true);
document.dispatchEvent(evt);
} else if (document.createEventObject) {
// MSIE (NOT WORKING)
document.documentElement.evt = 0; // an expando property
document.documentElement.attachEvent("jqmReady", function () {
document.documentElement.evt = document.documentElement.evt + 1;
});
}
});
我尝试了仅触发 $(window).trigger('jqmReady'),因为当 mobileinit 触发时,jquery 可用。但是似乎由 addEventListener 创建的事件不能像这样触发,因此我需要一个仅使用 JavaScript 的解决方案来在 IE 中触发自定义事件。
问题: 有人能给我指点如何正确地在 IE8 中触发 JavaScript 自定义事件吗?
jquery
~ $(document).ready() 将不可用。该片段位于 requireJS 初始化之后的页面上。因此,(1) 页面被解析,(2) requireJS 触发,(3) 我的片段执行。当它执行时,jquery
或jquery-mobile
都尚未完全加载。因此,必须仅使用 JavaScript。 - frequentdispatchEvent()
是否相关? - David ThomasdispatchEvent
。 - frequent