Объявление sQc скрипта jQuery выдает ошибку JavaScript, несмотря на то, что вызывается NoConflict - PullRequest
3 голосов
/ 19 сентября 2011

Я использую программу для опроса, которая дает (некоторую) свободу при программировании ваших собственных пользовательских функций / дизайна / и т.д. По умолчанию он использует Prototype. Я тоже хочу использовать jQuery. В заголовке я объявляю jQuery и вызываю noConflict, вот так:

<script src="SurveyResource/jquery.js"> </script>
<script>
jQuery.noConflict();
</script>

Когда я пытаюсь загрузить страницу, я получаю классическую ошибку «Объект не поддерживает это свойство или метод». Я также попытался удалить сценарий noConflict, и ошибка по-прежнему происходит только с объявлением. После быстрой отладки я обнаружил, что ошибка происходит в prototype.js, в этой функции:

fire: function(element, eventName, memo) {
  element = $(element);
  if (element == document && document.createEvent && !element.dispatchEvent)
    element = document.documentElement;

  var event;
  if (document.createEvent) {
    event = document.createEvent("HTMLEvents");
    event.initEvent("dataavailable", true, true);
  } else {
    event = document.createEventObject();
    event.eventType = "ondataavailable";
  }

  event.eventName = eventName;
  event.memo = memo || { };

  if (document.createEvent) {
    element.dispatchEvent(event);
  } else {
    element.fireEvent(event.eventType, event);
  }

  return Event.extend(event);
}

В частности, в этой строке: element.fireEvent(event.eventType, event);. Также я пользуюсь IE8. Извини за это. Кто-нибудь может помочь мне заставить этих двух детей хорошо играть вместе? Похоже, на эти вопросы нет ответов.

РЕДАКТИРОВАТЬ: вот скрипка того, что я считаю воспроизведением моей проблемы: http://jsfiddle.net/vbzju/7/

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

Ответы [ 2 ]

1 голос
/ 25 ноября 2012

Я также обнаружил, что NoConflict недостаточно, чтобы Internet Explorer выглядел менее глючно. Следующее изменение в функции prototype.js fire (около строки 5631) сработало для меня: поскольку все работает нормально с Firefox, Safari и Chrome, я проверяю токен версии в строке navigator.userAgent и избегаю вызова dispatchEvent, если я нахожу MSIE. Я добавил локальные переменные str и n. n является нулевым для браузеров, отличных от MSIE:

function fire(element, eventName, memo, bubble) {
element = $(element);

if (Object.isUndefined(bubble))
  bubble = true;

if (element == document && document.createEvent && !element.dispatchEvent)
  element = document.documentElement;

var event;
if (document.createEvent) {
  event = document.createEvent('HTMLEvents');
  event.initEvent('dataavailable', true, true);
} else {
  event = document.createEventObject();
  event.eventType = bubble ? 'ondataavailable' : 'onfilterchange';
}

event.eventName = eventName;
event.memo = memo || { };

var str=navigator.userAgent; 
var n=str.match(/MSIE/g);

if ((document.createEvent) && (n == null))
  element.dispatchEvent(event);
else
  element.fireEvent(event.eventType, event);

return Event.extend(event);
}
1 голос
/ 20 сентября 2011

В вашей скрипке jquery загружался дважды.Вот пример использования замыкания, так что вы можете использовать знак $ как для jquery, так и для прототипа.http://jsfiddle.net/vbzju/14/ Кроме того, вы должны сначала загрузить jquery, а затем прототип.

...