Мое расширение Firefox захватывает объект jQuery 1.4.2, который уже встроен в веб-страницу, а затем пытается использовать этот объект jQuery для изменения этой страницы. Он хорошо работал в Firefox 3.x, но не работает в Firefox 4.
Вот мой код:
window.addEventListener("load", function() { MyExt.init(); }, false);
var MyExt = {
targetHost: "somewebsite.com",
init: function() {
var appcontent = document.getElementById("appcontent"); // browser
if (appcontent){
appcontent.addEventListener("DOMContentLoaded", MyExt.onPageLoad, true);
}
},
onPageLoad: function(aEvent) {
var doc = aEvent.originalTarget; // doc is document that triggered "onload" event
var loc = doc.location;
var host = '';
if (loc.toString() != "about:blank") {
host = doc.location.host;
}
// Edit page
if (host == MyExt.targetHost) {
var $ = doc.defaultView.wrappedJSObject.$;
// this works
$('p').css('color', 'green');
// this works in Firefox 3.x, but does not work in Firefox 4
// instead it shows the following error:
// "Error: uncaught exception: TypeError: handler is undefined"
$('.sometextarea').keyup(function(event) { alert('it should work, but does not'); });
// even this does not work as expected
// it should display true, but it displays false
alert($.isFunction(function(){}));
}
}
Что я делаю не так?
1 ответ
Да, вы должны использовать wrappedJSObject
из-за API изменения:
Указание xpcnativewrappers=no в манифесте (то есть автоматизация XPCNativeWrapper) больше не поддерживается. Это всегда задумывалось как краткосрочный обходной путь, позволяющий расширениям продолжать работать, пока их авторы обновляют свой код для использования XPCNativeWrappers.
Если ваша надстройка зависит от привязок XBL, прикрепленных к объектам содержимого, — например, возможность вызывать функции или получать и устанавливать свойства, созданные привязкой XBL, — вам потребуется использовать свойство XPCNativeWrapper wrapJSObject для доступа к обернутым объектам.
Если вам нужно иметь возможность вызывать функции или получать доступ к свойствам, определенным веб-контентом, вам также необходимо сделать это. Это может иметь место, если, например, вы написали расширение, которое добавляет кнопку удаления в службу веб-почты, и служба определяет функцию window.delete(), которую вам нужно вызвать.
Если, с другой стороны, все, что вы делаете с содержимым, — это доступ к методам и свойствам DOM, вам никогда не нужно было использовать xpcnativewrappers=no в первую очередь, и вы должны просто удалить его из своего манифеста.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
toString
в jQuery был переписан, чтобы он не ломался при передаче объектов, происходящих из других окон/фреймов, гдеinstanceof
прерывается. Очевидно, они не рассматривали функциональные объекты.