有没有办法使 prompt
弹窗中的文本框/输入框支持多行?
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()
时显示一个多行输入字段。<textarea>
标记。alert()
和prompt()
。您使用的几乎任何库都应该有更好的解决方案。正如其他人所说,jquery也很好。此外,考虑通过设计更巧妙的接口来消除模态需求也是一个好主意。<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>
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,唯一的问题是非标准标签<textbox>
对用户界面意味着什么。XUL控件文档告诉我们它只是一个单行条目,您需要<textarea>
来获取更多:
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);
}
gtk_entry_new()
创建的,GTK文档指出GtkEntry
是"单行文本输入字段"。如果需要多行输入,您需要使用GtkTextView
:
所以这里有你的答案,不仅仅是“你能吗?”的回答,还有为什么你不能(在一些流行的浏览器实现中)。除非有一种方法可以用某种扩展来覆盖Firefox中的XUL,这可能是有的!我将把它留给读者作为练习。 :P<textbox>
可以是多行和单行的。这里是单行输入,因为缺少 multiline
属性。请注意,您发现的常见对话框在 Firefox 4 中与 Web 无关 - 它们已被替换为实现在其他地方(但沿着相同的线路)的选项卡模态对话框。 - Wladimir Palant<textbox>
和<textbox multiline="true"/>
。:) 无论如何,教程应该还是可以用的 - 就常规的XUL叠加而言,没有太多变化。但是你不会在叠加中走得太远,因为相关代码已经移动到了一个XBL绑定中(tabprompts.xml),并且更改它会更加复杂。 - Wladimir Palant使用双引号括起来的 \n ("\n")
prompt("This\nis\nmultiline");
textbox
。 - kazinix
document.open()
,document.write()
和<script>
标签来完成它。过程非常痛苦,但终于实现了。 - Wyatt Ward