padding打破jQuery选择器?

时间:2009-10-29 16:57:49

标签: jquery css padding

我今天早上花了2个小时试图找出为什么我的jQuery功能在页面的一个部分工作但不是另一个部分。

我最终把它缩小到容器上的垂直填充。

如果我在CSS中有这个:

div.collapsiblePanel {
padding: 0px 1%;
}

然后,通过jQuery,我可以找到父(.collapsiblePanel)元素,并可以遍历该div并操纵子元素。但是,如果我在样式表中将这一点改为:

div.collapsiblePanel {
padding: 5px 1%;
}

然后jQuery 可以找到父(.collapsiblePanel),但无法遍历子项。

疯狂,对吗?关于发生了什么的任何理论?我正在考虑这个问题,认为它与我的jQuery有关,但它最终是一个CSS问题。

根据请求,还有一些标记/ css /代码片段:

特定的jQuery函数(看似不起作用):

function finishUp(ajaxContainer,originalContainer,loadingAlert) {  
    $(ajaxContainer).find("input.btnSave").css("border","3px solid red");
    var saveButtonn = $(ajaxContainer).find("input.btnSave");
    console.log(ajaxContainer);
    console.log(originalContainer);
    console.log(loadingAlert);
    console.log(saveButton);
    $(ajaxContainer).find("input.btnSave").css("border","3px solid red").click(function(){
        alert("you clicked the save button");
        savePanel($(this));
    });

};  

之前的功能是,在之前的功能通过AJAX加载内容然后显示容器之后,此功能会进入并将按钮事件附加到按钮上。

正如您所看到的,我在那里有一堆额外的日志记录代码。当我的CSS垂直填充设置为'0'时,Firebug会记录每个填充的正确对象名称。当我将CSS垂直填充更改为其他任何内容时,最后一个对象(saveButton)在Firebug中返回为空/空。

HTML:

<div class="ajaxEditPanel editablePanel collapsiblePanel" style="display: block;">       
    <form>
         <fieldset class="sideLabels dividers">
         <legend>Edit Realtionship Information</legend>

              ...the form...
                <div class="formItem formButtons"
                    <input value="save" class="button btnSave" type="button">
                    <input value="cancel" class="button btnCancel" type="button">
                </div>                    
         </fieldset>        
    </form>
 </div> 

请注意,DIV由以前的jQuery函数创建并加载了内容。起初我认为这是一个计时问题,我试图将事件附加到尚未加载到DOM中的对象。但是,这并没有解释为什么相同的确切功能在页面的其他地方起作用。我可以改变的一个变量会使这个工作或不工作最终成为那个CSS填充。如果在函数当前工作的页面部分中,我还向容器添加了一些垂直填充,它们也会破坏jQuery选择子元素。

1 个答案:

答案 0 :(得分:0)

我相信我之前遇到过类似的事情 - 这可能是一个时间问题,在JS被告知要绑定到元素之后,DOM会呈现出轻微的变化。在你的情况下,填充可能会使firefox花费几毫秒来渲染那些div,从而导致绑定在有任何绑定之前触发。我理解Firebug也可以减慢渲染过程,因为它在点处跳入以在其帧中渲染源。

要确认不是这个,请尝试在绑定代码周围添加setTimeout(function(){ ... }, 500)(也可能关闭firebug)以查看它之后是否绑定。如果是,那就是你的问题。

另一种方法可能是将输入更改为链接并使用事件委派来触发事件:jQuery('.btnSave').live('click', function(){savePanel($('selector>for>panel')); })