Внедрение jQuery там, где существует Prototype - noConflict () - PullRequest
2 голосов
/ 24 июня 2011

Я использую только webkit.Мне нужно внедрить jQuery в страницу, на которой уже загружен прототип.Я использую этот код для загрузки JQuery.(вы можете попробовать в консоли)

var s = document.createElement('script');
s.setAttribute('src', 'http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js');
s.setAttribute('type', 'text/javascript');
document.getElementsByTagName('head')[0].appendChild(s);

Я получаю сообщение об ошибке только с кодом выше.

Как я могу использовать noConflict () при загрузке.Если я вставлю следующий код после внедрения скрипта jquery, я все равно получу ошибку.

$(document).ready(function() {
  jQuery.noConflict();
  // my thing here
});

Это также выдает ошибку:

jQuery.noConflict();
$(document).ready(function() {
  // my thing here
});

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

РЕДАКТИРОВАТЬ: Поскольку вы загружаете скрипт из другого скрипта, вы должны поместить код jQuery, который вам нужно запустить в обратном вызове к событию загрузки для вашего скрипта:

var s = document.createElement('script');
s.setAttribute('src', 'http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js');
s.setAttribute('type', 'text/javascript');
document.getElementsByTagName('head')[0].appendChild(s);

   // Place your code in an onload handler for the jQuery you're loading
s.onload = function() {

    jQuery.noConflict(); // release jQuery's hold on "$"

    jQuery(document).ready(function( $ ) {

      alert( $.fn.jquery );
   });
};

Другое решение было бы , а не использовать этот метод загрузки jQuery.Просто жестко закодируйте свой элемент <script>, и код будет выполняться ожидаемым синхронным образом:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js" type="text/javascript"></script>

<script type="text/javascript">
    jQuery.noConflict(); // release jQuery's hold on "$"

      // do this with ready() -------v------ and the "$" will be available inside
    jQuery(document).ready(function( $ ) {

      // $ is safe for jQuery inside this .ready() callback
      alert( $.fn.jquery );
    });
</script>

Исходный ответ:

Сделайте это:

var s = document.createElement('script');
s.setAttribute('src', 'http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js');
s.setAttribute('type', 'text/javascript');
document.getElementsByTagName('head')[0].appendChild(s);


jQuery.noConflict(); // release jQuery's hold on "$"

  // do this with ready() -------v------ and the "$" will be available inside
jQuery(document).ready(function( $ ) {

  // $ is safe for jQuery inside this .ready() callback
  alert( $.fn.jquery );
});
2 голосов
/ 24 июня 2011

Попробуйте

var $j = jQuery.noConflict();
$j(document).ready(function() {
  // my thing here
});

Затем вы можете использовать $ j для любого jquery $

1 голос
/ 24 июня 2011

Здесь вы сначала используете $, а затем jQuery.noConflict(), проблема в том, что вы (ошибочно) предположили, что $ - это jQuery до того, как вы установили конфликт без:

$(document).ready(function() {
  jQuery.noConflict();
  // my thing here
});

Здесь вы сделали обратное.Сначала вы сделали бит без конфликтов, хорошо, но затем продолжили использовать $ для доступа к jQuery, который больше не будет работать (как прямой результат вызова noConflict()):

jQuery.noConflict();
$(document).ready(function() {
  // my thing here
});

Объединив свои два усилия, вы получите следующее.Я также добавил $ в строку .ready, чтобы внутри функции ready вы могли по-прежнему использовать $ в качестве ссылки на jQuery.

jQuery.noConflict(); // stops $ being associated with jQuery
jQuery(document).ready(function($) { // use long-hand jQuery object reference to call `ready()`
  // my thing here
});
1 голос
/ 24 июня 2011

$ - псевдоним / ярлык для jQuery (а также прототип). NoConflict в основном освобождает контроль над ярлыком $, так что после вызова другая библиотека имеет над ним контроль. Попробуйте это:

jQuery(document).ready(function() {
  // my thing here
});
...