2012-01-04 58 views
1

我創建基於一個頁內腳本的GreaseMonkey腳本,我想use on a site,但是我有以下問題:如何從我的GreaseMonkey腳本調用添加到jQuery對象的函數?

在腳本中,我們已經創建了命名空間(brickJax)包含大部分函數,​​並且我們還需要jQuery,因爲我們也使用jQuery replaceText函數。

當我打電話replaceText功能從replaceSet我得到以下錯誤控制檯上:

uncaught exception: TypeError: $(node).replaceText is not a function

然而,並稱其爲GM_xmlhttpRequestonload回調的一部分工作正常。

var brickJax = (function ($) { 
    "use strict"; 
    var brickJax = {}; 

    //[Code here] 

    function replaceSet(node, str, number, colour) { 
    var text = '<a href="http://www.peeron.com/inv/sets/' + number + '-1">' 
       + number + ' on Peeron</a>'; 

    // THIS LINE THROWS THE ERROR: 
    $(node).replaceText(str, text); 
    } 

    function replaceImage(node, str, number, colour) { 
    getBricksForImage(number, colour, node, str); 
    } 

    function getBricksForImage(number, colour, node, str) { 
    GM_xmlhttpRequest({ 
     method: "POST", 
     url: "http://brickjax.doodle.co.uk/bricks.aspx/JsonDetails/" + number 
      + "/" + colour, 
     dataType: "jsonp", 
     onload: function (data) { 
      // THIS CALL WORKS PERFECTLY 
      $(node).replaceText(str, 
           buildImage($.parseJSON(data.responseText))); 
     } 
    }); 
    }; 

    function buildImage(ajaxData) { 
    var text = '<img style="max-height:100px;" src="' + ajaxData.Src 
       + '" alt="' + ajaxData.AltText + '" />'; 

    return text; 
    } 

    function replaceTags(element) { 
    var elements = $(element).find('*').andSelf(); 
    elements = elements.not($('script,noscript,style,textarea,pre,code') 
         .find('*').andSelf()); 

    searchText(elements, /\[part:([\w\-]*)(?::([\w\-]*))?\]/gi, replaceImage); 

    searchText(elements, /\[set:([\w\-]*)(?::([\w\-]*))?\]/gi, replaceSet); 
    }; 

})(jQuery); 

brickJax.replaceTags($('body')); 

(function ($) { $.fn.replaceText = function (b, a, c) { [...] } })(jQuery); 

在實際的腳本中,我已經添加了記錄,這表明node是在兩種情況下的HTML元素。

什麼是我在replaceSet的呼叫中做錯了,與回調中導致此錯誤的呼叫不同?

hosted version這兩個調用按預期工作。

對於腳本牆的道歉,我試圖將其切割到最基本的要領。

+1

看起來可能與封閉有關。嘗試在'var brickJax = ...'東西之前物理定義'replaceText'。 – 2012-01-04 17:59:44

+0

我會給你一個去,歡呼:) – 2012-01-04 18:42:25

+0

@BrockAdams - 如果你願意張貼這個建議作爲答案,我會高興地接受它 - 工作的一種享受謝謝你,我想我明白爲什麼;) – 2012-01-05 07:14:58

回答

相關問題