Страница 1 из 2

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

СообщениеДобавлено: 01 дек 2009, 23:43
bobroff
Здравствуйте.

Вопрос, наверное глупый, но как писать собственный модуль на 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 своим модулем.

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 00:28
admin
Добрый вечер. Вы должны привязать новый метод к элементу.
Код: Выделить всё
$(function(){
jQuery.fn.check = function(option) { 
$(".accordion").after("<p>"+option+"</p>");
}
$(".accordion").check("Привет");
});

Код: Выделить всё
<body>
    <div class="accordion"></div>
</body>

Читайте и учите:
http://slyweb.ru/jquery/4.php
http://docs.jquery.com/Plugins/Authoring

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 00:46
bobroff
Спасибо, прочитаю

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 11:08
bobroff
Все прочитал, попробовал написать код из вашего примера - все равно ошибка. Пишу
Код: Выделить всё
<body>
    <input type="submit" value="Send" id="testclick">
    <div class="accordion"></div>
</body>

<script type="text/javascript" charset="utf-8">
$(document).ready(function(){

$(function(){
         jQuery.fn.check = function(option) {
         $(".accordion").after("<p>"+option+"</p>");
      }
      });

      $("#testclick").click(function(){
         alert('hi');
         $(".accordion").check("Привет");
      })

});
</script>



Все равно ошибка:$(".accordion").check is not a function
[Break on this error] $(".accordion").check("?????????µ??");\r

Если код самой функции выносить в отдельный js файл и его подключать - тоже самое.

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 15:30
admin
И мой и Ваш код правилен, вот пример Вашего последнего скрипта http://slyweb.ru/scrip/ . У меня в FF всё работает. Какой у Вас браузер?

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 16:00
bobroff
Это кажется бредом, но код заработал после перезагрузки компьютера. Может это как-то связано с кэшем, денвером и т.п.?

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 16:28
admin
Скорее всего кэш. :D

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 18:07
bobroff
Уже и не знаю на что грешит, думаю скоро сойду ума. Если мой код запихнут в отдельный html файл - все работает. Когда вношу его же в на страницу сайта, который строю на Zend Framework - не работает. Как найти причину...

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 18:33
bobroff
Все, надеюсь нашел окончательную причину проблемы. У 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>

Re: Собственный модуль на jQuery

СообщениеДобавлено: 02 дек 2009, 18:50
bobroff
Методом исключения выяснил что проблема вот в этих строках кода
Код: Выделить всё
var ZFDebugLoad = window.onload;
                window.onload = function(){
                    if (ZFDebugLoad) {
                        ZFDebugLoad();
                    }
                    jQuery.noConflict();
                    ZFDebugCollapsed();
                };


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