【问题标题】:jQuery button widget not working properly on submit in ChromejQuery 按钮小部件在 Chrome 中提交时无法正常工作
【发布时间】:2012-12-23 05:59:40
【问题描述】:

我的网络有一个小问题。我在外部文件中有表格,如下所示。

<form action="/action.php" method="post" id="formularz_dodaj" target="iframe_id">
    <fieldset>
        <input type="hidden" name="ac" value="groups_save" />
        <ul>
            <li>
                Some fields here
            </li>
            <li class="buttons">
                <input type="submit" class="zapisz" value="Zapisz" />
                <input type="button" class="anuluj" value="Anuluj" />
            </li>
        </ul>
    </fieldset>
</form>
<script type="text/javascript">
    //<![CDATA[
    $j('.zapisz').button().click(function(){
        $j('.anuluj').hide();
    });
    $j('.anuluj').button().click(function(){
        $j('#dialog').dialog('close');
    });
    //]]>
</script>

如您所见,除了按钮之外没有什么特别之处。结果表单通过 jQuery 获取样式按钮。按钮&lt;input type="submit" class="zapisz" value="Zapisz" /&gt; 应该像正常提交一样工作,&lt;input type="button" class="anuluj" value="Anuluj" /&gt; 应该只是关闭对话框。 此表单通过 jQuery ajax() 方法放置在对话框中,如下所示:

var $j = jQuery.noConflict();
var main = new Object();

$j.extend($j.ui.dialog.prototype.options, {
modal: true,
resizable: false,
width:'auto',
height:'auto',
show:{
    effect:'fade',
    duration:'fast'
},
hide:{
    effect:'fade',
    duration:'fast'
},
open:function(){
    $j(this).find("input[type=text], input[type=password], input[type=checkbox],     select, textarea").uniform();
}
});
main.dialog = function(ob){
if(ob.url){
    var url = arguments.url;
    var dialog = $j("#dialog");
    if ($j("#dialog").length == 0) {
        dialog = $j('<div id="dialog" class="dialog" title=""></div>').appendTo('body');
    }
    if(ob.title){
        dialog.attr('title', ob.title);
    }
    $j.ajax({
        type:'POST',
        dataType:'html',
        data:ob.dane,
        url:ob.url,
        success:function(d){
            if(d == 'uprawnienia'){
                main.alert({
                    text:'Nie posiadasz uprawnie\u0144 do tej operacji.', 
                    title:'Brak uprawnie\u0144'
                });
            } else {
                $j("#dialog").html(d);
                $j("#dialog").dialog({
                    title:$j("#dialog").attr('title')
                });
            }
        },
        error:function(){
            alert('Niepoprawne rz\u0105danie.');
        }
    });
} else {
   alert('Brak pliku do za\u0142adowania.');
}
}

数据的目标是放置在主索引文件中的 iframe。

<iframe name="iframe_id" id="iframe_id" src="" style="display:none; width:400px; height:200px;"></iframe>

当我使用带有“.zapisz”类的按钮时会发生什么,在特定的浏览器中没有任何反应:IE8、Chrome、Safari。在 IE9 和 FireFox 中,它可以正常工作。

我已经在我的任何浏览器中检查了控制台,并且没有错误。没有来自表单的数据发送到 iframe。只执行click方法中添加的JS。

按钮“.zapisz”只有在document.getElemntById('formularz_dodaj').submit(); 写入点击函数时才能正常工作。

有人知道哪里出了问题吗?

【问题讨论】:

  • “在特定浏览器中什么都没有发生” - 你的意思是在其他浏览器(例如,Firefox 或更新的 IE)中确实发生了什么吗?跨度>
  • 你如何定义$j,试试$。此外,分享您的 CSS 也会有所帮助。
  • 我知道这与问题无关,但您也缺少&lt;ul&gt; 标签。你关闭你的 ul 而不先打开它。至少在您提供的代码中
  • “表单未提交”是什么意思?浏览器会去action.php吗?
  • 是的,在 FireFox 和 IE8 中一切正常:点击“zapisz”后提交表单。 code$j 简单定义为: var $j = jQuery.noConflict();code

标签: jquery forms button user-interface dialog


【解决方案1】:

把它包起来

$(function(){
//your code here
});

它应该可以工作!

如果仍然不起作用,请删除 .button() 并尝试

$(function(){
    $j('.zapisz').click(function(){
        $j('.anuluj').hide();
    });
    $j('.anuluj').click(function(){
        $j('#dialog').dialog('close');
    });
});

【讨论】:

  • OP已经有表单后面的JS,所以表单已经加载完毕。
  • 不。仍然缺乏提交表单。使用 button() 或没有它,它们的行为相同:未提交表单。
  • 替换为 跨度>
  • @Rohit Patel 抱歉,但这没有任何意义。 “Anuluj”应该只关闭对话框而不是从表单发送数据。
【解决方案2】:

试试这个方法:

$("document").ready(function() {
    $j('.zapisz').click(function(){
        $j('.anuluj').hide();
    });
    $j('.anuluj').click(function(){
        $j('#dialog').dialog('close');
    });
});

问候。

【讨论】:

  • 还是没什么。我很伤心:分配给按钮的 JS 工作得很好(就像这个 hide() 方法)。在某些浏览器中,我需要添加到样式提交按钮 submit() 方法中的全部内容。
  • 代码已经在表单下方,所以不需要ready()
【解决方案3】:

看到表单的目标是target="iframe_id"。您的页面中是否有任何隐藏的 iframe,因此提交已完成,但您无法“看到”它。

@ATOzTOA 给出的答案运行良好,但它会在新选项卡中打开。因此,您的页面中可能有一个隐藏的 iframe,而表单的目标是

编辑

您的 iframe 的名称和 ID 为 upload,但您在表单中的目标是 iframe_id。尝试将您的表单更改为

<form action="/action.php" method="post" id="formularz_dodaj" target="upload">

【讨论】:

  • 没错,有一个 iframe 应该完成所有工作。你给了我一些线索。在输入 code $j('iframe_id'); i Firefox 控制台后,它返回一个对象(如预期的那样),但在 chrome 中,相同的操作返回 NULL,这可能就是问题所在。我不知道下一步该怎么做。
  • 对不起,我的错。 Chrome 会选择 iframe。
  • 可能是对话框是“模态”并且 iframe 在索引文件中而不是在对话框本身中的问题吗?
  • 那是原始代码的副本,例如表格 i;v 更改了它以便更好地理解(我会解决这个问题)。在我的原始代码中,表单和 iframe 中使用的 ID 是相同的。
【解决方案4】:

由于没有解决方案或此类行为的明确原因,我建立了一些变通解决方案。因为所有对话框(在我的例子中)都包含按钮类 .zapisz 和/或 .anuluj 并且它们的用法在每种情况下都是相同的,所以我预定义了这样的代码:

$j.extend($j.ui.dialog.prototype.options, {
    modal: true,
    resizable: false,
    width:'auto',
    height:'auto',
    show:{
        effect:'fade',
        duration:'fast'
    },
    hide:{
        effect:'fade',
        duration:'fast'
    },
    open:function(){
        $j(this).find("input[type=text], input[type=password], input[type=checkbox], select, textarea").uniform();
        $j(this).find('input[type=submit], input[type=button]').button();
        $j(this).find('.zapisz').each(function(){
            $j(this).click(function(){
                $j(this).parents('form').submit();
                $j(this).parents('form').find('.ui-state-error').hide();
            });
        });
        $j(this).find('.anuluj').each(function(){
            $j(this).click(function(){
                $j(this).parents('.dialog').dialog('close');
            });
        });
        $j('.ui-icon.ui-icon-closethick').on('click', function(){
            $j(this).parent().parent().hide();
        });
        $j(this).find('.ui-state-error').hide();
        $j('span.opis').tooltip();
    }
});

此代码的作用是(省略效果等基本设置)当打开对话框时,它会搜索具有.zapisz 和/或.anuluj 类的按钮,并根据父级为它们提供适当的操作。所以现在不需要在我手动的每个表单中添加submit()

接下来是当我需要向这些按钮中的任何一个添加一些其他操作时,我只需将它们写入表单本身,就像这样:

$j('.zapisz').click(function(){
    $j('.anuluj').hide();
    $j(this).val('Wysy\u0142am dane');
    $j(this).attr('disabled', 'disabled');
});

注意在添加click()之前不再有button()方法。

现在我的对话框可以按照我的意愿进行格式化,并且默认情况下可以正常工作。

我仍然不知道为什么我的问题会在某些浏览器中发生,所以如果您有任何关于这方面的信息,那对未来会很好。

【讨论】:

    【解决方案5】:

    一个问题:/action.php 将尝试加载位于文件系统根目录中的action.php。你应该使用./action.php

    这在 Chrome、Firefox 和 IE6 中运行良好:

    <form action="./action.php" method="post" id="formularz_dodaj" onsubmit="alert('Submitting form');" target="iframe_id">
        <fieldset>
            <input type="hidden" name="ac" value="groups_save" />
            <ul>
                <li>
                    Some fields here
                </li>
                <li class="buttons">
                    <input type="submit" class="zapisz" value="Zapisz" />
                    <input type="button" class="anuluj" value="Anuluj" />
                </li>
            </ul>
        </fieldset>
    </form>
    
    <script type="text/javascript">
        $('.zapisz').click(function(){
            $('.anuluj').hide();
            return true;
        });
    
        $('.anuluj').click(function(){
            $('#dialog').dialog('close');
        });
    </script>
    

    【讨论】:

    • 是的。按钮设置为 type="submit"。但我还是尝试了:仍然没有区别。
    • 不显示警报。我正在使用相对于我的页面的 ROOT 的路径,所以这不是问题。没有发送数据,所以甚至出现 404 之类的错误。
    • 你是说有404错误吗?您可以将当前代码放入 jsFiddle 中吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多