Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.12.2009, 20:15
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Собственный модуль на jQuery
Здравствуйте.

Вопрос, наверное глупый, но как писать собственный модуль на jQuery? Взял за основу вот этот пример: http://www.rsdn.ru/article/inet/jQuery.xml

Пишу в .php файле:
...
<script type="text/javascript" src="ingredientsStorage.js"></script>
...

<script type="text/javascript" charset="utf-8">
 $("#ingredients input").click(function(){
    	$("#ingredients input").check('on');
    });
</script>


Сам ingredientsStorage.js (в точности, как в примере из ссылки выше)
jQuery.fn.check = function(mode) {
   // если mode не определен, используем 'on' по умолчанию
   var mode = mode || 'on';
   
   // В функцию неявно передана коллекция выбранных элементов.
   // Поэтому с этой коллекцией можно работать, как с любой другой
   // коллекцией элементов в jQuery
   // В нашем случае мы воспользуемся методом each()
   return this.each(function() 
   {
     switch(mode) {
       case 'on':
         this.checked = true;
         break;
       case 'off':
         this.checked = false;
         break;
       case 'toggle':
         this.checked = !this.checked;
         break;
     }
   });
 };


В результате FireBug пишет:
$("#ingredients input").check is not a function
[Break on this error] $("#ingredients input").check('on');\r


P.S.: сайт пишу на Zend Frameword, но это не должно никак влиять на расширение jQuery своим модулем.

Последний раз редактировалось bobroff, 01.12.2009 в 20:26.
Ответить с цитированием
  #2 (permalink)  
Старый 02.12.2009, 09:08
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Цитата:
В функцию неявно передана коллекция выбранных элементов
Неявно? Хм, this содержит на нее ссылку, куда уж явнее

А киньте-ка минимальную страничку, на которой не работает. Я просто скопипастил содержимое ingredientsStorage.js в консоль, и плагин работает.

UPD Вот рабочий пример. Отличие в присутствии .ready, иначе не будет бинда. Но ошибка в консоль все равно не должна падать.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<title>Без имени</title>

	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<meta name="generator" content="Geany 0.18" />

    <script type="text/javascript" src="jquery-1.3.2.js"></script>
    <script type="text/javascript"><!--
        jQuery.fn.check = function(mode) {
           // если mode не определен, используем 'on' по умолчанию
           var mode = mode || 'on';
         
           // В функцию неявно передана коллекция выбранных элементов.
           // Поэтому с этой коллекцией можно работать, как с любой другой
           // коллекцией элементов в jQuery
           // В нашем случае мы воспользуемся методом each()
           return this.each(function() 
           {
             switch(mode) {
               case 'on':
                 this.checked = true;
                 break;
               case 'off':
                 this.checked = false;
                 break;
               case 'toggle':
                 this.checked = !this.checked;
                 break;
             }
           });
         };
    //--></script>
    <script type="text/javascript"><!--
    $(function(){
        $(':checkbox').click(function(e){
            $(':checkbox').check('on');
        });
    });
    //--></script>
</head>

<body>
<p><input type="checkbox" /><input type="checkbox" /><input type="checkbox" /></p>
</body>

</html>

Последний раз редактировалось e1f, 02.12.2009 в 09:18.
Ответить с цитированием
  #3 (permalink)  
Старый 02.12.2009, 13:02
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Это кажется бредом, но код заработал после перезагрузки компьютера. Может это как-то связано с кэшем, денвером и т.п.?
Ответить с цитированием
  #4 (permalink)  
Старый 02.12.2009, 13:20
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Даже не знаю, что ответить
Да, по поводу плагина: попробуйте сделать
$(':checkbox').click(function(e){
    $(':checkbox').check('toggle');
});

И сразу видно неприятный баг: чекбокс, на который кликнули, ведет себя неправильно.
Ответить с цитированием
  #5 (permalink)  
Старый 02.12.2009, 15:09
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Уже и не знаю на что грешит, думаю скоро сойду ума. Если мой код запихнут в отдельный html файл - все работает. Когда вношу его же в на страницу сайта, который строю на Zend Framework - не работает. Как найти причину...
Ответить с цитированием
  #6 (permalink)  
Старый 02.12.2009, 15:15
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Скиньте ссылку на проблемную страницу.
Ответить с цитированием
  #7 (permalink)  
Старый 02.12.2009, 15:35
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Все, надеюсь нашел окончательную причину проблемы. У Zend Framework есть такой плагин Zend Debug, который облегчает разработку сайта. Когда его отключил, все заработало!!! Все силы из меня высосала эта хрень. Теперь вопрос, как работать без таких ошибок при включенном Zend Debug.

Ссылку к сожалению скинуть не могу, т.к. работаю локально, а все сайт скидывать не имеет смысла. Проблемный код вот:
<script type="text/javascript" charset="utf-8">
                if (typeof jQuery == "undefined") {
                    var scriptObj = document.createElement("script");
                    scriptObj.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
                    scriptObj.type = "text/javascript";
                    var head=document.getElementsByTagName("head")[0];
                    head.insertBefore(scriptObj,head.firstChild);
                }

                var ZFDebugLoad = window.onload;
                window.onload = function(){
                    if (ZFDebugLoad) {
                        ZFDebugLoad();
                    }
                    jQuery.noConflict();
                    ZFDebugCollapsed();
                };

                function ZFDebugCollapsed() {
                    if (1 == 1) {
                        ZFDebugPanel();
                        jQuery("#ZFDebug_toggler").html("&#187;");
                        return jQuery("#ZFDebug_debug").css("left", "-"+parseInt(jQuery("#ZFDebug_debug").outerWidth()-jQuery("#ZFDebug_toggler").outerWidth()+1)+"px");
                    }
                }

                function ZFDebugPanel(name) {
                    jQuery(".ZFDebug_panel").each(function(i){
                        if(jQuery(this).css("display") == "block") {
                            jQuery(this).slideUp();
                        } else {
                            if (jQuery(this).attr("id") == name)
                                jQuery(this).slideDown();
                            else
                                jQuery(this).slideUp();
                        }
                    });
                }

                function ZFDebugSlideBar() {
                    if (jQuery("#ZFDebug_debug").position().left > 0) {
                        document.cookie = "ZFDebugCollapsed=1;expires=;path=/";
                        ZFDebugPanel();
                        jQuery("#ZFDebug_toggler").html("&#187;");
                        return jQuery("#ZFDebug_debug").animate({left:"-"+parseInt(jQuery("#ZFDebug_debug").outerWidth()-jQuery("#ZFDebug_toggler").outerWidth()+1)+"px"}, "normal", "swing");
                    } else {
                        document.cookie = "ZFDebugCollapsed=0;expires=;path=/";
                        jQuery("#ZFDebug_toggler").html("&#171;");
                        return jQuery("#ZFDebug_debug").animate({left:"5px"}, "normal", "swing");
                    }
                }

                function ZFDebugToggleElement(name, whenHidden, whenVisible){
                    if(jQuery(name).css("display")=="none"){
                        jQuery(whenVisible).show();
                        jQuery(whenHidden).hide();
                    } else {
                        jQuery(whenVisible).hide();
                        jQuery(whenHidden).show();
                    }
                    jQuery(name).slideToggle();
                }
            </script>
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2009, 15:47
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Ну, по набору этих функций я тоже вряд ли что-то скажу. Сделайте тестовую самодостаточную страницу, которая демонстрирует проблему -- потихоньку вырубайте со страницы все ненужное, следя, чтобы репродьюсился баг. Глядишь, и станет видно, что к чему.
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2009, 15:51
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Методом исключения выяснил что проблема вот в этих строках кода
var ZFDebugLoad = window.onload;
                window.onload = function(){
                    if (ZFDebugLoad) {
                        ZFDebugLoad();
                    }
                    jQuery.noConflict();
                    ZFDebugCollapsed();
                };


Похоже проблема в $(). Надо писать jQuery(). Я прав?

Последний раз редактировалось bobroff, 02.12.2009 в 15:54.
Ответить с цитированием
  #10 (permalink)  
Старый 02.12.2009, 16:08
Аспирант
Отправить личное сообщение для bobroff Посмотреть профиль Найти все сообщения от bobroff
 
Регистрация: 28.11.2009
Сообщений: 30

Закоментировал
//jQuery.noConflict();
и все заработало
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jquery - Как получить полный путь? kirill.adw jQuery 5 20.11.2009 16:40
JQuery + FireFox NOOB jQuery 4 02.11.2009 17:16
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 12:31
Jquery, Dynatree и JSON antirek jQuery 6 01.09.2009 14:00
Как правильно подгрузить jQuery Siton jQuery 4 15.06.2009 08:54