Как я могу вызвать функции, добавленные в объект jQuery из моего скрипта GreaseMonkey? - PullRequest
1 голос
/ 04 января 2012

Я создал скрипт GreaseMonkey на основе скрипта на странице, который я хотел бы использовать на сайте , однако у меня возникла следующая проблема:

ВСценарий, мы создали наше пространство имен (brickJax), которое содержит большую часть функций, и мне потребовался jQuery, так как мы также используем функции jQuery replaceText.

Когда я вызываюreplaceText функция из replaceSet Я получаю следующую ошибку на консоли:

исключение uncaught: TypeError: $ (node) .replaceText не является функцией

Тем не менее, вызов его как части обратного вызова 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, который отличается от вызова в обратном вызове, который вызывает эту ошибку?

В размещенной версии оба вызова работают как положено.

Извиняюсь за стену скрипта, я триЭд, чтобы сократить его до самого необходимого.

1 Ответ

1 голос
/ 05 января 2012

Это связано либо с замыканием, либо с функцией , определенной в выражении против объявления .

В любом случае, решение должно быть таким же, перенести определение replaceText физически до var brickJax = ....

...