我創建基於一個頁內腳本的GreaseMonkey腳本,我想use on a site,但是我有以下問題:如何從我的GreaseMonkey腳本調用添加到jQuery對象的函數?
在腳本中,我們已經創建了命名空間(brickJax
)包含大部分函數,並且我們還需要jQuery,因爲我們也使用jQuery replaceText函數。
當我打電話replaceText
功能從replaceSet
我得到以下錯誤控制檯上:
uncaught exception: TypeError: $(node).replaceText is not a function
然而,並稱其爲GM_xmlhttpRequest
onload
回調的一部分工作正常。
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這兩個調用按預期工作。
對於腳本牆的道歉,我試圖將其切割到最基本的要領。
看起來可能與封閉有關。嘗試在'var brickJax = ...'東西之前物理定義'replaceText'。 – 2012-01-04 17:59:44
我會給你一個去,歡呼:) – 2012-01-04 18:42:25
@BrockAdams - 如果你願意張貼這個建議作爲答案,我會高興地接受它 - 工作的一種享受謝謝你,我想我明白爲什麼;) – 2012-01-05 07:14:58