gpt4 book ai didi

javascript - 无法在 JavaScript 中正确使用新窗口表单中的选择选项值

转载 作者:行者123 更新时间:2023-11-28 08:06:38 25 4
gpt4 key购买 nike

我是 JavaScript 新手,我之前问了一个问题并得到了对我有帮助的答案,但我认为我可以将它合并到我正在使用的更大的表单中,但现在我又陷入困境了。

我有一个大表单,其中有一个选择选项。填写表单后,将打开一个新窗口,并将提交的值合并到邀请类型页面中。

除了这个选择选项之外,其他一切都正常。我遇到的问题是根据选择,我希望将不同的文本写入新窗口(作为整个新窗口邀请页面的一部分)。

我真的很接近,主要是我今天早些时候收到的帮助 - 我可以让新窗口只显示我命名的选项值,或者我可以得到一个带有不同文本的全新窗口(即不是邀请页面的一部分)。我只是无法将两者结合起来。

我写了一个较小的页面,以防有人想看一下。提前致谢。

 <!doctype html>
<html>
<head>
<title>JavaScript Forms</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="mystyle.css">
<script type="text/JavaScript">

function newWindow() {
allInfo = open("", "displayWindow");

allInfo.document.open();

allInfo.document.write('<!doctype html><html><head><link rel="stylesheet" type="text/css" href="mystyle_invite.css"><title>Resume</title><meta charset="utf-8"> </head><body>');
allInfo.document.write(document.getElementById ('firstname').value);
allInfo.document.write('</body></html>');

allInfo.document.close();

}

function showName() {

var doIt=document.getElementById('firstname').value;

if ( doIt == "Michael" ) {
allInfo.document.write("Mr. " + doIt); //only "Mikey" is written out
}
else if ( doIt == "Sam" ) {
allInfo.document.write("Mrs. " + doIt);
}
else {
allInfo.document.write("Sir " + doIt);
}
}
</script>
</head>
<body>
<script type="text/JavaScript">
</script>

<form id="infoForm" method="post" name="infoForm">

<p>First Name:</p>
<p><select id="firstname" onChange="showName()" >
<option value="Mikey">nickname1</option>
<option value="Sammy">nickname2</option>
<option value="Sir Doug">nickname3</option>
</select></p>

<p> <input type="button" value="Submit Information" onClick="newWindow()"></p>
</form>

</body>

</html>

最佳答案

这里有些东西可以提供很大帮助。第一次打开第二个窗口对于用户和程序员来说都是痛苦的经历。除非您有绝对需要,否则我建议您操作当前窗口的 DOM 以显示弹出窗口。

下一步是否可以使用 DOM 方法来更改页面内容。 document.write 带来了很多问题,在您的情况下这些问题并不明显。主要是它可以删除你当前的 DOM。您在示例中没有注意到这一点,因为新窗口是空白的,因此重写它是偶然的。

最后,使用 allInfo 是引用全局变量的一种奇怪的方式。从代码风格来看,这是不容易理解的。事实上,任何 linter 都会因您使用全局而抛出错误,并且如果您在函数中声明“use strict”,则会出现错误。最好学习良好的编码实践方式。

由于我们希望与您的情况下的变量 (allInfo) 进行交互,因此我们应该将该值封装在一个对象中。该对象可以保存该引用的状态并提供与它的一些抽象交互。通过这样做,您可以避免污染全局 namespace ,并允许您交换实现,而不必重写程序中依赖于它的部分。

// Our welcome window object
function WelcomeWindow() {
// save a reference to the content of your new window
// to be printed when ready. (Lazy execution)
this.innerHTML = '';
}
WelcomeWindow.prototype.open = function() {
this.win = window.open("", "displayWindow");
return this;
};
WelcomeWindow.prototype.close = function() {
this.win.close();
return this;
};
WelcomeWindow.prototype.write = function(html) {
this.innerHTML += '' + html;
return this;
};
WelcomeWindow.prototype.render = function() {
if (!this.win) { throw new Error("window has not been opened yet."); }
this.win.open();
this.win.write('<!doctype html><html><head><link rel="stylesheet" type="text/css" href="mystyle_invite.css"><title>Resume</title><meta charset="utf-8"> </head><body>');
this.win.write(this.innerHTML);
this.win.write('</body></html>');
this.win.close();
return this;
};

这允许我们在窗口打开之前以声明方式对其进行操作。例如,如果我们想将名称添加到窗口:

function NameField(id) {
this.element = document.getElementById(id);
}
NameField.prototype.toString = function() {
var name = this.element.value;
switch (name) {
case 'Michael': return 'Mr. Michael';
case 'Sam': return 'Mrs. Sam';
default: return 'Sir ' + name;
}
};
NameField.prototype.toHtml = function() {
return '<strong>' + this.toString() + '</strong>';
};

使用代码将其链接在一起,因为将事件添加到 DOM 中只会混淆标记和代码的分离。

window.onload = function() {
var form = document.getElementById('infoForm');
form.onsubmit = function(e) {
e.preventDefault();
var name = new NameField('firstName');
new WelcomWindow()
.write(name.toHtml())
.open()
.render();
return false;
};
};

关于javascript - 无法在 JavaScript 中正确使用新窗口表单中的选择选项值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com