【问题标题】:Is this a correct way to call a javascript function?这是调用javascript函数的正确方法吗?
【发布时间】:2009-06-01 06:00:29
【问题描述】:

这是用 jquery 调用我的 javascript 函数的正确方法吗?我花了过去 5 个小时试图弄清楚为什么这不起作用。

<form class="rpt" id="rpt" action="">

$(function() {
  $("#rpt").submit(doSave);
});
</script>

这是 javascript 所见即所得编辑器中的小 sn-p 代码。我仍然在我的 html 中使用完全相同的表单标签。

        // Save
        case "Save":
            WYSIWYG.updateTextArea(n);
            var form = WYSIWYG_Core.findParentNode("FORM", this.getEditor(n));
            if(form == null) {
                alert("Can not submit the content, because no form element found.");
                return;
            }
            form.submit();
        break;

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    提交函数有两种变体。如果您致电$('#rpt').submit();,您将触发表单的“提交”事件。如果您调用 $('#rpt').submit(myFunctionName); 您正在将 myFunctionName 绑定到表单的“提交”事件。这个不会在页面加载时被触发,只有在你尝试提交表单时才会触发。因此,这段代码:

    <form id="rpt" method="GET" action="http://www.google.com/search">
    Search: <input type="text" name="q"> <input type="submit" value="Go">
    </form>
    

    还有这个 Javascript:

    function myFunctionName() {
       alert('The form is being submitted!');
       return false; // cancel the event (ie, the form will not be sent)
    }
    $(function() {
        $('#rpt').submit(myFunctionName);
    });
    

    仅在提交表单时调用myFunctionName 函数(通过手动按下“Go”按钮或在文本字段获得焦点时按下 Enter)。 Here is a sample of it at work。如果你想在页面加载时运行一个特定的函数,你所要做的就是传递一些东西给$(document).ready();函数,或者简称$():

    function onLoadDoThis() {
        alert('Page is loaded!');
    }
    $(document).ready(onLoadDoThis); // $(onLoadDoThis); is the same thing
    

    还有here is an example of this。希望这清除了一些东西...

    编辑

    好的,所以我准备了一个工作示例来说明您正在尝试做的事情。起初我很生气你不能让它工作,但实际上有很多限制你必须解决,因为这个编辑器有多糟糕。无论如何,进入解释:

    第一个问题是库将 $ 的使用覆盖到它自己的小函数中。所以 jQuery 令人敬畏是不可能的常规方式。谢天谢地,jQuery is awesome,您可以通过以下方式解决这个问题:

    $j = jQuery.noConflict();
    

    现在你必须做$j(...);,而不是$(...);。如果您没有意识到这一点,很可能您正在尝试编写 jQuery 代码,但没有发生任何事情。

    您可能遇到的下一个障碍是对于大多数 事件,当您执行$(selector).myevent(aFunction); 之类的操作时,假定执行$(selector).myevent(); 将触发所述事件。但是,this is not true of the submit event。除非表单操作由用户触发,否则当通过代码提交表单时,不会调用绑定到表单提交的代码。因此,即使编辑器源代码中form.submit(); 的行只是触发表单的本机提交事件,即使您使用 Javascript 将事件绑定到此事件,在这种情况下也不会调用它,因为用户没有触发提交事件,代码触发了。

    由于这个限制,在不编辑编辑器源代码的情况下实现您想要的变得越来越棘手。您会看到,编辑器将其“创建所有仪表板废话”的内容附加到窗口的加载事件中。该事件在 jQuery 的 DOM 就绪事件之后触发,因为 jQuery 就绪的全部意义在于尽快触发,而不是一秒钟后触发,而 window.load 度过了美好的时光。所以我们要做的就是抛弃 jQuery 绑定代码 (grimace) 并使用编辑器自己的绑定代码在它自己的“创建仪表板”功能之后直接附加一个事件。此时,仪表板已经创建,因此我们可以访问“保存”按钮并使其执行我们想要的操作 - 只有在删除了您在源代码中找到的调用“保存”函数的原始事件之后。

    最终,代码看起来像这样:

    $j = jQuery.noConflict(); // give up ownership of $ to WYSIWYG
    
    WYSIWYG.attach('textarea1', full); // first attach the event to create this widget
    
    WYSIWYG_Core.addEvent(window, "load", function() {
        // and now override the Save button
        // the removeAttr('onclick') is crucial to stop it
        // from doing what it normally does (Which is submit the form)
        $j('#Save').removeAttr('onclick').click(function() {
            var form = $j('#myform');
            var data = form.serialize();
            var type = form.attr('method');
            var url = form.attr('action');
            $j.ajax({
                url: url,
                type: type,
                data: data,
                dataType: 'json',
                success: function(d) {
                    if(d.success == 1) {
                        $j('#notice').html('Everything went alright! High fives.');
                    } else {
                        $j('#notice').html('Something went wrong. Eep.');
                    }
                }
            });        
        });
    });
    

    虽然my_handler.php 是一个非常简单的脚本,它只返回一个 json 字符串:

    <?php
    // process your stuff here, set success as 1 or 0
    $success = 1;
    print json_encode(array('success' => $success));
    ?>
    

    And here is an example of it in action.

    就我个人而言,我真的不喜欢这个特别的编辑器,我建议你看看别的。

    无论如何,我希望这会有所帮助。

    【讨论】:

    • 我很好奇。为什么您的帖子以“嘿,弗兰克”开头?
    • 嘿 Paolo... 感谢上帝,你出现了。大声笑..这件事让我发疯了!事情太简单了,我花了我周日的一半时间试图让它工作,但仍然没有。无论如何..非常感谢您的帮助。让我问你.. 我有一个使用 form.submit() 的所见即所得编辑器。这与编辑器上的一个小图标相关联。在阅读了您发布的内容(并感谢您提供链接)后,我需要哪一个?
    • @nutjob:编辑在form.submit上做了什么,你想在submit上做什么?
    • 好的,我认为 form.submit 只是触发任何 action="" 是表单标签。至少它以前是这样工作的。我想要的是,无论提交是否成功,您的代码都会简单地回显给用户,就像您帮助我处理的其他表单一样。这个只是因为 javascript submit.form() 而不同。我不知道如何让它工作。如果它是一个普通的输入按钮,没有汗水。
    • 也许你需要拼凑一个你正在尝试做的实际例子。所见即所得的编辑器不应该真正搞乱表单的提交事件——它所做的只是展示——你是否假设提交事件发生了一些事情?当您说“它所做的就是触发任何动作”时,这就是浏览器默认执行的操作,因此您可以将一个事件绑定到表单的提交事件并在那里进行处理......
    【解决方案2】:

    由于“rpt”是类名和表单名,您可以使用“.”。或“#”,假设“doSave”是用作回调的函数的名称,它将起作用。所以,它可以这样调用:

    $(".rpt").submit(doSave);
    function doSave(){
      //do something
    }
    

    或者你可以让函数本身可以是参数:

    $(".rpt").submit(function(){
      //do something here
    });
    

    编辑:如果您不希望表单回发。添加“return false;”。

    $("#rpt").submit(doSave);
    function doSave(){
      //do something
      alert("form submit fired");
      return false;
    }
    

    【讨论】:

    • 您好 Jose,再次感谢您的帮助。这真的很奇怪,因为我已经获取了您的代码,而不是依赖于具有 doSave 函数的内联 js 标记,而是将 doSave 函数直接放入脚本标记之间的 html 中,但我仍然无法收到警报火。这是我正在使用的。 $(".rpt").submit(doSave);函数 doSave(){ 警报(); }
    • @nutjob - alert() 需要有一些东西,否则它不会触发。例如:alert("some message");
    • 谢谢何塞。我已经尝试过各种方式。我现在用 alert('dfdfdadf'); 试过了。仍然一无所有。 :/ 感谢 Jose 的帮助。
    • 感谢何塞的编辑。你不会相信这一点,但它不起作用。提交表单后,我仍然得到完全相同的白屏。完全没有警觉。这真的很奇怪。我还检查了 id 名称“rpt”没有在其他地方使用,也没有,只是在表单标签中。
    【解决方案3】:

    比这更简单:

    $("#rpt").submit(doSave);
    

    如果这不起作用,那是因为您使用的是 JQuery 集,即使您对提交表单元素感兴趣。如果是这样,请尝试让 JQuery 相信它只是一个元素:

    $("#rpt").eq(0).submit(doSave);
    

    【讨论】:

    • 您好机器,感谢您的帮助。我只是尝试了两段代码,但没有向我显示该函数内的警报,而是被引导到一个空白页面。我不明白这一点..我对此感到有些疯狂。 :)
    • 你好机器。实际上,我将函数放在 html 内部的 acript 标记之间,但仍然无法触发这个东西。 $(".rpt").submit(doSave);函数 doSave(){ 警报(); }
    【解决方案4】:

    doSave 函数可能必须在源代码中定义得早于将其绑定到提交事件的代码...

    此代码不起作用

    // doSave is undefined at this point
    $("#rpt").submit(doSave);
    
    // Now we've defined doSave, but it's too late.
    function doSave(){
      //do something
      alert("form submit fired");
      return false;
    }
    

    我相信这段代码应该可以工作:

    $("#rpt").submit( function (){
        alert("submitted");
        return false;    
    });
    

    或者如果你必须单独定义 doSave,试试这个:

    // First define doSave
    function doSave(){
      //do something
      alert("form submit fired");
      return false;
    }
    
    // Then bind it
    $("#rpt").submit(doSave);
    

    【讨论】:

    • jsbin.com/isoya 在绑定后定义函数,至少在 FF 上对我来说可以正常工作
    • 好吧,我什么都掌握了,我尝试了上面所有的三段代码,但仍然没有。我假设 $("#rpt").submit(doSave);应该绑定 id rpt 并调用该函数。对吗?
    • 耸耸肩我试了一下。我的新观点是我们需要看到更多的代码。
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2015-12-07
    • 2012-05-03
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多