jqtransform表单select(onchange)问题!

时间:2010-05-05 12:06:49

标签: javascript forms events onchange

我正在使用Jqtransform脚本设置表单样式。 该表单包含一个选择器,用于登记某些城市,当我点击一个城市时,它应该使用该城市内的某些位置更新其下方的选择器。

这是选择器的代码

<select name="city" id="city" class="wide" onchange="populateDestrict(this)"> 

它在默认样式下工作正常,但在应用JQ后,它失去了它的功能

我在此之前提出了一个问题LINK

我和Dormilich写的那样做了:

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

但它不起作用!

这里也是函数的代码,如果它有帮助

<script language="javascript">
    function populateDestrict(obj){
        var city=obj.value;
            if(city!=""){
                $.post('city_state.php',{ city: city},function(xml){ 
                    $("#state").removeOption(/./);
                    $("district",xml).each(function() {
                    $("#state").addOption($("key",this).text(), $("value",this).text());
                });
            });
            }
    }
</script>

任何帮助人们???????? 感谢

5 个答案:

答案 0 :(得分:4)

您可能遇到<select>元素具有<option>元素的情况,其中标签与值不同。例如,您可能拥有与每个城市对应的唯一ID:

<form id="formTransform">   
   <div id="boxRelated">
      <select name="city">
         <option value="21">Gotham</option>
         <option value="12">New York City</option>
         <option value="34">Smallville</option>
      </select>
      <div class="clear"></div>   
   </div> 
</form>

只需在jqTransform列表中的所选链接上调用.text()即可获得标签,但不会显示<option>元素的值。

要解决此问题,您可以使用jqtransform列表中父<li>元素的索引来索引表单上的<select>元素:

<script> 

   $("#formTransform").jqTransform();

   $("#boxRelated div.jqTransformSelectWrapper ul li a").click(function(){
      var value = $(this).parent().index();
      $("[name=city]").attr('selectedIndex', value);

      // will alert 21, 12, or 34 depending on which one was selected
      alert($("[name=city]").val()); 
      return false; 
   }); 

</script>

答案 1 :(得分:2)

如何选择显示为none,甚至不会发生事件。 所以你要做的就是处理创建jqtransform的read事件的click事件

<form id="formTransform">   
   <div id="boxRelated">
        <select name="select-country">
            <option>Gotham</option>
            <option>New York City</option>
            <option>Smallville</option>
        </select>
     <div class="clear"></div>   
  </div> 
</form>

<script> 

$("#formTransform").jqTransform();

$("#boxRelated div.jqTransformSelectWrapper ul li a").click(function(){
    var value= $("#boxRelated div.jqTransformSelectWrapper span").text()
    alert("Value Selected = "+value);
    return false; //prevent default browser action 
}); 
</script>

答案 2 :(得分:2)

可能会迟到但......最近面临同样的问题。解决方案是使用此版本的jqTransform脚本:

注意: 1)打开jqTransform文件 2)删除所有内容 3)COPY 代码低于 4)PASTE 5)SAVE。

VOILA !!

    /*
     *
     * 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

答案 3 :(得分:1)

这是从转换后的选择下拉列表中获取所选值的简便方法:

$("#boxRelated div.jqTransformSelectWrapper ul li a").click(function(){

    var SelectedVal = $("#boxRelated option:selected").val();

    console.log(SelectedVal);

})

答案 4 :(得分:-1)

$("#city").change(populateDestrict);

在JavaScript中(与HTML事件属性不同),您必须分配函数引用。使用带括号的括号将导致函数的返回值被赋值而不是函数(IE当然会自己做)。

您还必须相应地修改您的功能 - 只需使用this代替obj。作为事件对象传递的第一个也是唯一的参数(不是在IE中,但是jQuery会处理它)