我有一些预制的javascript,它与来自数据库的罐装响应表单交互。当单击插入按钮时,没有发生任何事情,chrome显示错误:Uncaught TypeError:无法读取null 的属性"selectionStart"
以下是javascript/php/html/
<tr><?php echo tep_draw_form('status', FILENAME_ORDERS, tep_get_all_get_params(array('action')) . 'action=update_order'); ?>
<td class="main">
<script language="javascript">
function insereTexto(){
//Paste into textarea
var textarea = document.getElementById("txt");
//Text to be inserted
var texto = document.getElementById("txtValor").value;
//beginning of the selection
var sel_start = textarea.selectionStart;
//end of the selection
var sel_end = textarea.selectionEnd;
if (!isNaN(textarea.selectionStart))
//Treatment for Mozilla
{
var sel_start = textarea.selectionStart;
var sel_end = textarea.selectionEnd;
mozWrap(textarea, texto, '')
textarea.selectionStart = sel_start + texto.length;
textarea.selectionEnd = sel_end + texto.length;
}
else if (textarea.createTextRange && textarea.caretPos)
{
if (baseHeight != textarea.caretPos.boundingHeight)
{
textarea.focus();
storeCaret(textarea);
}
var caret_pos = textarea.caretPos;
caret_pos.text = caret_pos.texto.charAt(caret_pos.texto.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
}
else //For those who can not enter, insert at the end of it (ie. ..)
{
textarea.value = textarea.value + texto;
}
}
/*
This function opens the text of two strings and inserts the text at the cursor position well after he joins novamento text but the text entered
This wonderful feature only works in Mozilla ... IE does not have the properties SelectionStart, textLength ...
*/
function mozWrap(txtarea, open, close)
{
var selLength = txtarea.textLength;
var selStart = txtarea.selectionStart;
var selEnd = txtarea.selectionEnd;
var scrollTop = txtarea.scrollTop;
if (selEnd == 1 || selEnd == 2)
{
selEnd = selLength;
}
//S1 has the text from the beginning to the cursor position
var s1 = (txtarea.value).substring(0,selStart);
//S2 has the selected text
var s2 = (txtarea.value).substring(selStart, selEnd)
//S3 has all the selected text
var s3 = (txtarea.value).substring(selEnd, selLength);
//Places the text in the textarea. Uses the string that was in the beginning, in the middle of the input string, then the selection string then the
//closing and finally what's left after the selection
txtarea.value = s1 + open + s2 + close + s3;
txtarea.selectionStart = selEnd + open.length + close.length;
txtarea.selectionEnd = txtarea.selectionStart;
txtarea.focus();
txtarea.scrollTop = scrollTop;
return;
}
/*
Insert at Caret position. Code from
[url]http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130[/url]
*/
function storeCaret(textEl)
{
if (textEl.createTextRange)
{
textEl.caretPos = document.selection.createRange().duplicate();
}
}
</script>
<select id="txtValor" />
<option value="">Select Text</option>
<option value="<?php echo $order->customer['name']; ?>">Customer Name</option>
<option value="<?php echo STORE_NAME_ADDRESS; ?>">signature</option>
<option value="<?php echo STORE_NAME; ?>">Store Name</option>
<option value="<?php echo $_SERVER['SERVER_NAME']; ?>">Site</option>
<option value="<?php echo STORE_OWNER; ?>">Store Owner</option>
<option value="<?php echo STORE_OWNER_EMAIL_ADDRESS; ?>">Email the Store</option>
<?php
$get_premades_query = tep_db_query("select * from orders_premade_comments order by id");
while($result = mysql_fetch_array($get_premades_query)) {
echo '<option value="'.$result["text"].'">'. $result["title"].'</option>';
}
?>
</select>
<input type="button" value="Insert at the cursor position" onclick="insereTexto()"/>
<input type="button" value="Clean" onclick="this.form.elements['comments'].value=''">
<font class="smallText"><a href="premade_comments.php">[Setup]</a></font><br>
<?php echo tep_draw_textarea_field('comments', 'soft', '80', '10','','id="txt"'); ?></td>
</tr>
我真的不太懂javascript,php正在调用正确的数据库字段,我可以正确地回显它们。但我猜选择Start函数没有正确使用?
消息显示:
Cannot read property 'selectionStart' of null
这是正确的:null
没有属性,所以它不能有selectionStart
。
那么null
是从哪里来的呢?textarea
:请求.selectionStart
//beginning of the selection
var sel_start = textarea.selectionStart;
CCD_ 6来自DOM:
//Paste into textarea
var textarea = document.getElementById("txt");
很明显,getElementById()
调用返回的是null
,而不是什么。
您应该检查HTML以验证是否有一个id为txt
的文本区域。你也可以添加一个显式检查,以防这种情况只是间歇性发生:
//Paste into textarea
var textarea = document.getElementById("txt");
if (!textarea)
alert("Och! No txt textarea defined?");
发生这种情况时,请检查HTML源代码以验证发生这种情况的原因。也许你并不总是显示文本区域,也许ID发生了变化,等等。
这是的问题
var textarea = document.getElementById("txt");
未在您的文档中定义
另一个警告:使用不支持的html标签
<font class="smallText"><a href="premade_comments.php">[Setup]</a></font>
<font>
标签在HTML 5中不受支持,在HTML 4.01 中已贬值这里有一个提示:为了代码的可读性,请使用php short-handecho表示法。
这个
<?php echo STORE_NAME_ADDRESS; ?>
与
<?=STORE_NAME_ADDRESS ?>
相同,当您进行多个回波语句时,它看起来更好