【问题标题】:JavaScript - multi-line textbox in prompt()?JavaScript - 提示()中的多行文本框?
【发布时间】:2011-11-07 11:59:32
【问题描述】:

有没有办法在prompt多行中制作文本框/输入框?

【问题讨论】:

    标签: javascript prompt


    【解决方案1】:

    使用 \n 括在双引号中(“\n”)

    prompt("This\nis\nmultiline");
    

    【讨论】:

    • Alex,我的意思是textbox作为输入框。
    • 在这种情况下,没有。提示是本机浏览器对象,因此不能直接编辑。您最好使用 jQuery 或类似的东西创建自己的 :-)
    【解决方案2】:

    不,浏览器只允许prompt() 的单行输入。 不过,只要对 jQuery Alert Dialogs 库进行简单的更改,您就可以在那里获得多行输入。取jquery.alerts.js,查找<input type="text" size="30" id="popup_prompt" /> 并将其替换为<textarea rows="5" cols="30" id="popup_prompt"></textarea>。调用jPrompt() 时应该会显示多行输入字段。

    编辑:正如 Mulletfingers999 在评论中指出的那样,jQuery 警报对话框已被弃用,取而代之的是 jQuery UI dialogs。在那里您还可以显示一个“模态”对话框,但是该对话框可以具有任意内容 - 这意味着如果您想要多行输入,则可以使用 <textarea> 标签。

    【讨论】:

    • 新用户:插件已归档,开发者推荐jQuery UI的dialog widget
    • 希望避免使用 jquery,因为我将其用作简单的 javascript 书签。
    • @Wyatt8740:然后你必须重新实现功能——用你的图层覆盖页面并添加提示内容。不幸的是,这并不完全是微不足道的。
    • @WladimirPalant 刚刚意识到您是 7-zip 的作者。谢谢 :) 另外,我使用document.open()document.write()<script> 标签完成了它。巨大的痛苦,但它有效。
    • @Wyatt8740:不,我与 7-zip 无关。
    【解决方案3】:

    如今,对于几乎所有面向用户的 Web 应用程序,您都希望避免使用像 alert()prompt() 这样的笨重的旧对话框。您使用的几乎所有库都应该有更好的答案。 jquery 会像其他人所说的那样好。想想如何通过设计一个更聪明的界面来消除对模式的需求也是一件好事。

    “有趣的是”,在 Firefox 中,他们已经在使用 XUL 并在此基础上重新发明了许多用户界面(而不是依赖于底层操作系统的“通用对话框”)。 /source/toolkit/components/prompts/content/tabprompts.xml中有模态对话框的模板:

    <vbox anonid="infoContainer" align="center" pack="center" flex="1">
        <description anonid="info.title" class="info.title" hidden="true" />
        <description anonid="info.body" class="info.body"/>
    </vbox>
    
    <row anonid="loginContainer" hidden="true" align="center">
        <label anonid="loginLabel" value="&editfield0.label;" control="loginTextbox"/>
        <textbox anonid="loginTextbox"/>
    </row>
    
    <row anonid="password1Container" hidden="true" align="center">
        <label anonid="password1Label" value="&editfield1.label;" control="password1Textbox"/>
        <textbox anonid="password1Textbox" type="password"/>
    </row>
    
    <row anonid="checkboxContainer" hidden="true">
        <spacer/>
        <checkbox anonid="checkbox"/>
    </row>
    

    他们所做的只是隐藏他们不需要的 UI 元素。在调用prompt 的情况下,他们重复使用用户名字段并隐藏密码和复选框元素。您可以在/source/toolkit/components/prompts/src/CommonDialog.jsm#52 中看到这种情况:

    case "prompt":
      this.numButtons = 2;
      this.iconClass  = ["question-icon"];
      this.soundID    = Ci.nsISound.EVENT_PROMPT_DIALOG_OPEN;
      this.initTextbox("login", this.args.value);
      // Clear the label, since this isn't really a username prompt.
      this.ui.loginLabel.setAttribute("value", "");
      break;
    

    由于它或多或少是 HTML,唯一的问题是非标准标签 &lt;textbox&gt; 对用户界面意味着什么。 XUL 控件文档告诉我们它只是一个单行条目,您需要&lt;textarea&gt; 了解更多信息:

    https://developer.mozilla.org/en/XUL_controls

    我认为在 GTK 之上查看 Chromium 中的实现也会很“有趣”。经过一番挖掘 WebKit 的迂回包装后,我确实找到了chromium/src/chrome/browser/ui/gtk/js_modal_dialog_gtk.cc,特别是这部分:

    // Adjust content area as needed.  Set up the prompt text entry or
    // suppression check box.
    if (ui::MessageBoxFlags::kIsJavascriptPrompt == dialog_->dialog_flags()) {
      GtkWidget* content_area =
          gtk_dialog_get_content_area(GTK_DIALOG(gtk_dialog_));
      GtkWidget* text_box = gtk_entry_new();
      gtk_entry_set_text(GTK_ENTRY(text_box),
          UTF16ToUTF8(dialog_->default_prompt_text()).c_str());
      gtk_box_pack_start(GTK_BOX(content_area), text_box, TRUE, TRUE, 0);
      g_object_set_data(G_OBJECT(gtk_dialog_), kPromptTextId, text_box);
      gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE);
    }
    

    text_box 是用gtk_entry_new() 创建的,GTK documentation 声明GtkEntry“单行文本输入字段”。对于多行输入,您必须使用 GtkTextView:

    http://developer.gnome.org/gtk/2.24/GtkTextView.html

    所以你的答案不仅仅是“你能吗?”但是为什么你不能(在几个流行的浏览器实现中)的确凿证据。除非有一种方法可以用某种扩展覆盖 Firefox 中的 XUL,很可能有!我将把它作为练习留给读者。 :P

    【讨论】:

    • &lt;textbox&gt; 可以是both multi-line and single-line。但是,这里是单行输入,因为缺少 multiline 属性。请注意,从 Firefox 4 开始,您发现的常见对话框与网络无关 - 它们已被在其他地方实现的选项卡模式对话框取代(但沿相同的思路)。
    • @Wladimir:感谢您阅读它。我要指出,截至 2011 年 8 月,Firefox 3.6 仍然是 30.28% 的 Firefox 用户,因此还不是“与网络无关”。我对我链接的 XUL 文档中的遗漏不承担任何责任。我是不是第一次深入研究这些代码库,出于我自己的好奇心,我在回答一个问题时会说“不,你不能”。我花了一点时间尝试制作一个覆盖今天提示的扩展,但决定在 Firefox 6 中尝试这样做,似乎大多数“如何制作扩展”教程已经烂掉了。
    • 您链接到的文档同时列出了&lt;textbox&gt;&lt;textbox multiline="true"/&gt;。 :) 无论如何,教程应该还是不错的——就常规的 XUL 覆盖而言,没有什么改变。但是您不会对叠加层走得太远,因为相关代码已移入 XBL 绑定 (tabprompts.xml) 并且更改该绑定要复杂得多。
    • 哦,多行,你怎么嘲讽我。你知道,我确实做了很多研究,然后在事后返回并找到我认为相同的文件,但毕竟可能有所不同。无论哪种方式,如果它强烈暗示一个差异化特征,然后又抛出一个“......但是!”,它就会变得混乱
    • true,prompt() 已经过时了——但对于小书签来说,它使用起来非常简单。 (另请注意,不幸的是,Mozilla 在 2015 年决定弃用 XUL - 一场真正的悲剧)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多