Мое расширение 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
Will 23 Мар 2011 в 19:41
Кто-нибудь знает, связано ли это с изменением xpcnativewrappers=no в Firefox 4?
 – 
Will
25 Мар 2011 в 07:51
1
Что иронично, так это то, что toString в jQuery был переписан, чтобы он не ломался при передаче объектов, происходящих из других окон/фреймов, где instanceof прерывается. Очевидно, они не рассматривали функциональные объекты.
 – 
Roatin Marth
5 Апр 2011 в 23:21

1 ответ

Да, вы должны использовать wrappedJSObject из-за API изменения:

Указание xpcnativewrappers=no в манифесте (то есть автоматизация XPCNativeWrapper) больше не поддерживается. Это всегда задумывалось как краткосрочный обходной путь, позволяющий расширениям продолжать работать, пока их авторы обновляют свой код для использования XPCNativeWrappers.

Если ваша надстройка зависит от привязок XBL, прикрепленных к объектам содержимого, — например, возможность вызывать функции или получать и устанавливать свойства, созданные привязкой XBL, — вам потребуется использовать свойство XPCNativeWrapper wrapJSObject для доступа к обернутым объектам.

Если вам нужно иметь возможность вызывать функции или получать доступ к свойствам, определенным веб-контентом, вам также необходимо сделать это. Это может иметь место, если, например, вы написали расширение, которое добавляет кнопку удаления в службу веб-почты, и служба определяет функцию window.delete(), которую вам нужно вызвать.

Если, с другой стороны, все, что вы делаете с содержимым, — это доступ к методам и свойствам DOM, вам никогда не нужно было использовать xpcnativewrappers=no в первую очередь, и вы должны просто удалить его из своего манифеста.

0
Community 20 Июн 2020 в 12:12