【问题标题】:jqtransform form events problemjqtransform表单事件问题
【发布时间】:2010-05-04 11:34:25
【问题描述】:

我是一名有 css 经验的网页设计师,但我不是 JS 开发人员。

我使用 jqtransform 来设置搜索表单的样式, 问题是它会从选择器和搜索按钮中删除所有事件。

这是jqtransform之前的代码

<input id="go-search" type="button" name="btn_search" value="search" onclick="searchLocations()" />

在应用脚本后,按钮不做任何事情 我打开了页面源代码,这里是这样的:

<button class=" jqTransformButton" type="button" name="btn_search" id="go-search"><span><span>search</span></span></button>

请帮帮我!

【问题讨论】:

    标签: javascript events forms


    【解决方案1】:

    我认为最好在新帖子中提出新问题……

    $(function() { $("form.jqtransform").jqTransform(); $("#city").click(populateDestrict); });
    

    当通过 JavaScript 为事件分配函数时,您只分配函数引用。在函数标识符后面加上括号将执行函数。

    function myFunction(x)
    {
        alert(x);
        return 1;
    }
    
    // correct, the onload event will trigger the function
    window.onload = myFunction;
    // alerts "[object Event]"
    
    // wrong
    window.onload = myFunction("hello");
    // this assigns "1" to the onload property*
    // * - IE may execute this, but no standard compliant browser
    

    【讨论】:

      【解决方案2】:

      据我们所知,只有按钮受到影响。该脚本将您原来的按钮替换为新按钮,因此除了 id、name、type 和 class 属性之外的所有内容都将被删除。当 jqtransform 完成它的工作时,你必须重新分配函数。

      // after jqtransform
      // probably $("#go-search").click(searchLocations); in jQuery, but I’m not a jQuery user … thus in plain JavaScript:
      var bt = document.getElementById("go-search");
      if (window.addEventListener) {
          bt.addEventListener("click", searchLocations, false);
      }
      else {
          bt.attachEvent("onclick", searchLocations);
      }
      

      我会冒险猜测它的使用方式

      $(function() {
          //find all form with class jqtransform and apply the plugin
          $("form.jqtransform").jqTransform();
          // fix your button
          $("#go-search").click(searchLocations);
      });
      

      【讨论】:

        【解决方案3】:

        可能会迟到,但是...最近遇到了同样的问题。解决方案是使用这个版本的 jqTransform 脚本:

        注意: 1) 打开您的 jqTransform 文件2)删除所有内容3)复制 4) PASTE5) SAVE 下方的代码。

        瞧!!

            /*
             *
             * jqTransform
             * by mathieu vilaplana mvilaplana@dfc-e.com
             * Designer ghyslain armand garmand@dfc-e.com
             *
             *
             * Version 1.0 25.09.08
             * Version 1.1 06.08.09
             * Add event click on Checkbox and Radio
             * Auto calculate the size of a select element
             * Can now, disabled the elements
             * Correct bug in ff if click on select (overflow=hidden)
             * No need any more preloading !!
             *
             ******************************************** */
        
            (function($){
                    var defaultOptions = {preloadImg:true};
                    var jqTransformImgPreloaded = false;
        
                    var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
                            //guillemets to remove for ie
                            strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'$1').replace(/^\"(.*)\"$/,'$1');
                            var imgHover = new Image();
                            imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-hover.$1');
                            var imgFocus = new Image();
                            imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-focus.$1');                        
                    };
        
        
                    /***************************
                      Labels
                    ***************************/
                    var jqTransformGetLabel = function(objfield){
                            var selfForm = $(objfield.get(0).form);
                            var oLabel = objfield.next();
                            if(!oLabel.is('label')) {
                                    oLabel = objfield.prev();
                                    if(oLabel.is('label')){
                                            var inputname = objfield.attr('id');
                                            if(inputname){
                                                    oLabel = selfForm.find('label[for="'+inputname+'"]');
                                            }
                                    }
                            }
                            if(oLabel.is('label')){return oLabel.css('cursor','pointer');}
                            return false;
                    };
        
                    /* Hide all open selects */
                    var jqTransformHideSelect = function(oTarget){
                            var ulVisible = $('.jqTransformSelectWrapper ul:visible');
                            ulVisible.each(function(){
                                    var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
                                    //do not hide if click on the label object associated to the select
                                    if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
                            });
                    };
                    /* Check for an external click */
                    var jqTransformCheckExternalClick = function(event) {
                            if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
                    };
        
                    /* Apply document listener */
                    var jqTransformAddDocumentListener = function (){
                            $(document).mousedown(jqTransformCheckExternalClick);
                    };     
        
                    /* Add a new handler for the reset action */
                    var jqTransformReset = function(f){
                            var sel;
                            $('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
                            $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
                            $('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jqTransformChecked');}});
                    };
        
                    /***************************
                      Buttons
                     ***************************/
                    $.fn.jqTransInputButton = function(){
                            return this.each(function(){
                                    var newBtn = $('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>')
                                            .hover(function(){newBtn.addClass('jqTransformButton_hover');},function(){newBtn.removeClass('jqTransformButton_hover')})
                                            .mousedown(function(){newBtn.addClass('jqTransformButton_click')})
                                            .mouseup(function(){newBtn.removeClass('jqTransformButton_click')})
                                    ;
                                    $(this).replaceWith(newBtn);
                            });
                    };
        
                    /***************************
                      Text Fields
                     ***************************/
                    $.fn.jqTransInputText = function(){
                            return this.each(function(){
                                    var $input = $(this);
        
                                    if($input.hasClass('jqtranformdone') || !$input.is('input')) {return;}
                                    $input.addClass('jqtranformdone');
        
                                    var oLabel = jqTransformGetLabel($(this));
                                    oLabel && oLabel.bind('click',function(){$input.focus();});
        
                                    var inputSize=$input.width();
                                    if($input.attr('size')){
                                            inputSize = $input.attr('size')*10;
                                            $input.css('width',inputSize);
                                    }
        
                                    $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
                                    var $wrapper = $input.parent().parent().parent();
                                    $wrapper.css("width", inputSize+10);
                                    $input
                                            .focus(function(){$wrapper.addClass("jqTransformInputWrapper_focus");})
                                            .blur(function(){$wrapper.removeClass("jqTransformInputWrapper_focus");})
                                            .hover(function(){$wrapper.addClass("jqTransformInputWrapper_hover");},function(){$wrapper.removeClass("jqTransformInputWrapper_hover");})
                                    ;
        
                                    /* If this is safari we need to add an extra class */
                                    $.browser.safari && $wrapper.addClass('jqTransformSafari');
                                    $.browser.safari && $input.css('width',$wrapper.width()+16);
                                    this.wrapper = $wrapper;
        
                            });
                    };
        
                    /***************************
                      Check Boxes
                     ***************************/  
                    $.fn.jqTransCheckBox = function(){
                            return this.each(function(){
                                    if($(this).hasClass('jqTransformHidden')) {return;}
        
                                    var $input = $(this);
                                    var inputSelf = this;
        
                                    //set the click on the label
                                    var oLabel=jqTransformGetLabel($input);
                                    oLabel && oLabel.click(function(){aLink.trigger('click');});
        
                                    var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
                                    //wrap and add the link
                                    $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
                                    //on change, change the class of the link
                                    $input.change(function(){
                                            this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                                            return true;
                                    });
                                    // Click Handler, trigger the click and change event on the input
                                    aLink.click(function(){
                                            //do nothing if the original input is disabled
                                            if($input.attr('disabled')){return false;}
                                            //trigger the envents on the input object
                                            $input.trigger('click').trigger("change");     
                                            return false;
                                    });
        
                                    // set the default state
                                    this.checked && aLink.addClass('jqTransformChecked');          
                            });
                    };
                    /***************************
                      Radio Buttons
                     ***************************/  
                    $.fn.jqTransRadio = function(){
                            return this.each(function(){
                                    if($(this).hasClass('jqTransformHidden')) {return;}
        
                                    var $input = $(this);
                                    var inputSelf = this;
        
                                    oLabel = jqTransformGetLabel($input);
                                    oLabel && oLabel.click(function(){aLink.trigger('click');});
        
                                    var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>');
                                    $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);
        
                                    $input.change(function(){
                                            inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                                            return true;
                                    });
                                    // Click Handler
                                    aLink.click(function(){
                                            if($input.attr('disabled')){return false;}
                                            $input.trigger('click').trigger('change');
        
                                            // uncheck all others of same name input radio elements
                                            $('input[name="'+$input.attr('name')+'"]',inputSelf.form).not($input).each(function(){
                                                    $(this).attr('type')=='radio' && $(this).trigger('change');
                                            });
        
                                            return false;                                  
                                    });
                                    // set the default state
                                    inputSelf.checked && aLink.addClass('jqTransformChecked');
                            });
                    };
        
                    /***************************
                      TextArea
                     ***************************/  
                    $.fn.jqTransTextarea = function(){
                            return this.each(function(){
                                    var textarea = $(this);
        
                                    if(textarea.hasClass('jqtransformdone')) {return;}
                                    textarea.addClass('jqtransformdone');
        
                                    oLabel = jqTransformGetLabel(textarea);
                                    oLabel && oLabel.click(function(){textarea.focus();});
        
                                    var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
                                    strTable +='<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
                                    strTable +='<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';  
                                    strTable +='<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
                                    strTable +='</table>';                                 
                                    var oTable = $(strTable)
                                                    .insertAfter(textarea)
                                                    .hover(function(){
                                                            !oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
                                                    },function(){
                                                            oTable.removeClass('jqTransformTextarea-hover');                                       
                                                    })
                                            ;
        
                                    textarea
                                            .focus(function(){oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');})
                                            .blur(function(){oTable.removeClass('jqTransformTextarea-focus');})
                                            .appendTo($('#jqTransformTextarea-mm div',oTable))
                                    ;
                                    this.oTable = oTable;
                                    if($.browser.safari){
                                            $('#jqTransformTextarea-mm',oTable)
                                                    .addClass('jqTransformSafariTextarea')
                                                    .find('div')
                                                            .css('height',textarea.height())
                                                            .css('width',textarea.width())
                                            ;
                                    }
                            });
                    };
        
                    /***************************
                      Select
                     ***************************/  
                    $.fn.jqTransSelect = function(){
                            return this.each(function(index){
                                    var $select = $(this);
        
                                    if($select.hasClass('jqTransformHidden')) {return;}
                                    if($select.attr('multiple')) {return;}
        
                                    var oLabel  =  jqTransformGetLabel($select);
                                    /* First thing we do is Wrap it */
                                    var $wrapper = $select
                                            .addClass('jqTransformHidden')
                                            .wrap('<div class="jqTransformSelectWrapper"></div>')
                                            .parent()
                                            .css({zIndex: 10-index})
                                    ;
        
                                    /* Now add the html for the select */
                                    $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
                                    var $ul = $('ul', $wrapper).css('width',$select.width()).hide();
                                    /* Now we add the options */
                                    $('option', this).each(function(i){
                                            var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
                                            $ul.append(oLi);
                                    });
        
                                    /* Add click handler to the a */
                                    $ul.find('a').click(function(){
                                                    $('a.selected', $wrapper).removeClass('selected');
                                                    $(this).addClass('selected');  
                                                    /* Fire the onchange event */
                                                    //if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
                                                    if ($select[0].selectedIndex != $(this).attr('index')) { $select[0].selectedIndex = $(this).attr('index'); $select.change(); }
        
                                            //Redundent code
                                                    //$select[0].selectedIndex = $(this).attr('index');
                                                    $('span:eq(0)', $wrapper).html($(this).html());
                                                    $ul.hide();
                                                    return false;
                                    });
                                    /* Set the default */
                                    $('a:eq('+ this.selectedIndex +')', $ul).click();
                                    $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
                                    oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
                                    this.oLabel = oLabel;
        
                                    /* Apply the click handler to the Open */
                                    var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
                                            .click(function(){
                                                    //Check if box is already open to still allow toggle, but close all other selects
                                                    if( $ul.css('display') == 'none' ) {jqTransformHideSelect();}
                                                    if($select.attr('disabled')){return false;}
        
                                                    $ul.slideToggle('fast', function(){                                    
                                                            var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
                                                            $ul.animate({scrollTop: offSet});
                                                    });
                                                    return false;
                                            })
                                    ;
        
                                    // Set the new width
                                    var iSelectWidth = $select.outerWidth();
                                    var oSpan = $('span:first',$wrapper);
                                    var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
                                    $wrapper.css('width',newWidth);
                                    $ul.css('width',newWidth-2);
                                    oSpan.css({width:iSelectWidth});
        
                                    // Calculate the height if necessary, less elements that the default height
                                    //show the ul to calculate the block, if ul is not displayed li height value is 0
                                    $ul.css({display:'block',visibility:'hidden'});
                                    var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff
                                    (iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff
                                    $ul.css({display:'none',visibility:'visible'});
        
                            });
                    };
                    $.fn.jqTransform = function(options){
                            var opt = $.extend({},defaultOptions,options);
        
                            /* each form */
                             return this.each(function(){
                                    var selfForm = $(this);
                                    if(selfForm.hasClass('jqtransformdone')) {return;}
                                    selfForm.addClass('jqtransformdone');
        
                                    $('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();                       
                                    $('input:text, input:password', this).jqTransInputText();                      
                                    $('input:checkbox', this).jqTransCheckBox();
                                    $('input:radio', this).jqTransRadio();
                                    $('textarea', this).jqTransTextarea();
        
                                    if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
                                    selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
        
                                    //preloading dont needed anymore since normal, focus and hover image are the same one
                                    /*if(opt.preloadImg && !jqTransformImgPreloaded){
                                            jqTransformImgPreloaded = true;
                                            var oInputText = $('input:text:first', selfForm);
                                            if(oInputText.length > 0){
                                                    //pour ie on eleve les ""
                                                    var strWrapperImgUrl = oInputText.get(0).wrapper.css('background-image');
                                                    jqTransformPreloadHoverFocusImg(strWrapperImgUrl);                                     
                                                    var strInnerImgUrl = $('div.jqTransformInputInner',$(oInputText.get(0).wrapper)).css('background-image');
                                                    jqTransformPreloadHoverFocusImg(strInnerImgUrl);
                                            }
        
                                            var oTextarea = $('textarea',selfForm);
                                            if(oTextarea.length > 0){
                                                    var oTable = oTextarea.get(0).oTable;
                                                    $('td',oTable).each(function(){
                                                            var strImgBack = $(this).css('background-image');
                                                            jqTransformPreloadHoverFocusImg(strImgBack);
                                                    });
                                            }
                                    }*/
        
        
                            }); /* End Form each */
        
                    };/* End the Plugin */
        
        })(jQuery);
        

        你也可以在这里得到同样的结果:http://pastebin.com/Q1pYMKZ2

        【讨论】:

          猜你喜欢
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-01
          相关资源
          最近更新 更多