在另一个 <script> 标签中打开 Jquery-ui 对话框

Posted

技术标签:

【中文标题】在另一个 <script> 标签中打开 Jquery-ui 对话框【英文标题】:Open Jquery-ui dialog in another <script> tag 【发布时间】:2018-03-24 03:12:58 【问题描述】:

是否可以在不同的“脚本”标签中初始化和打开 jquery-ui 对话框,如下所示:

规范:使用 EJS(Nodejs express 模板)

<script>
    $(document).ready(function() 

        $("#loginfailed").dialog(
            width: 500, autoOpen: false, resizable: false, draggable: false,
            modal: false 
        );


    );

</script>

//some html

 <% if (lengthQ1 == 0 && lengthQ2 == 0)  %>
     <script>
          $( "#loginfailed" ).text("User not exist");
         $( "#loginfailed" ).dialog("open");  
     </script>
    <%  else if (lengthQ1  == null  && lengthQ2 == null)  %>
     <script>
     </script>
    <%  else if (lengthQ1  > 0  || lengthQ2 > 0 && PasswordMatch != true)  %>
     <script>
          $( "#loginfailed" ).text("Wrong password");
         $( "#loginfailed" ).dialog("open");  
     </script>
    <%  %>

实际上,对话框没有显示,我不明白为什么。当我移动时

$( "#loginfailed" ).dialog("open"); 

在 document.ready 函数中,它会在页面加载时向我显示对话框。

假设 if 语句及其中的所有内容都可以正常工作(用简单的对话框替换时

alert("wrong password"`)

它的工作原理

【问题讨论】:

可以的。我建议在对话框中定义一个常量变量,以便您可以在另一个脚本块中引用或重新初始化它。 就个人而言,如果可能的话,我会将我所有的 JS 保存在一个脚本块中。您是否有理由分解脚本块? 【参考方案1】:

您不能在块之间传递变量,但可以访问对话框。您可以执行以下操作(假设初始脚本块位于头部):

<script>
$(function() 
  $("#loginFailed").dialog(
    width: 500,
    autoOpen: false,
    resizable: false,
    draggable: false,
    modal: false 
  );
);
</script>
//some html
<% if (lengthQ1 == 0 && lengthQ2 == 0)  %>
  <script>
  $("#loginFailed").text("User not exist.").dialog("instance").open();  
  </script>
<%  else if (lengthQ1  == null  && lengthQ2 == null)  %>
  <script>
  // Do Nothing?
  </script>
<%  else if (lengthQ1  > 0  || lengthQ2 > 0 && PasswordMatch != true)  %>
  <script>
  $("#loginFailed").text("Wrong password").dialog("instance").open();  
  </script>
<%  %>

工作示例:https://jsfiddle.net/Twisty/drL16vyc/

更多详情:https://learn.jquery.com/jquery-ui/widget-factory/widget-method-invocation/

在底层,每个小部件的每个实例都使用jQuery.data() 存储在元素上。要检索实例对象,请使用小部件的全名作为键调用jQuery.data()

在 jQuery UI 1.11 中,新的 instance() 方法将使这个过程变得更加容易。

$( ".selector" ).dialog( "instance" ).close();

现在,从字里行间看,我假设您有某种登录表单,并且正在将数据发回给自己以进行身份​​验证。为什么不通过 AJAX 做到这一点?

<script>
var $lfDiag;
$(function() 
  $lfDiag = $("#loginFailed").dialog(
    width: 500,
    autoOpen: false,
    resizable: false,
    draggable: false,
    modal: false 
  );
  $("form").submit(function(e)
    e.preventDefault();
    var url = $(this).attr("action");
    var myFormData = 
      api: "json"
    ;
    var loginFailed = true;
    $(this).find("input").each(function(ind, el)
      myFormData[$(el).attr("id")] = $(el).val();
    );
    $.post(url, myFormData, function(results)
      if(results.error.length)
        $lfDiag.text(results.error).dialog("open");
       else 
        loginFailed = false;
      
    );
    return !loginFailed;
  );
);
</script>

现在此设置需要进行一些调整。您将需要一个条件表单处理程序,该处理程序可以针对您的数据库验证提交的详细信息。条件是如果api 设置为json,它将发回json 数据。这可能是:


  success: true

或者:


  success: false,
  error: "User does not exist."

如果发布的数据不包括api 数据,那么脚本应该像平常一样处理登录。我假设这是在登录用户并设置一些会话变量。

【讨论】:

以上是关于在另一个 <script> 标签中打开 Jquery-ui 对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面输出HTML标签

使用 <include> 标签修改包含在另一个布局中的布局中的视图

Javascript的函数定义在一个script标记对中,能不能在另一个script中调用?

如何使用javascript打开新标签中的数组链接?

外部脚本必须包含 <script> 标签吗?

python解析html时解析不到不到网页源码中script下面的信息