Javascript ';未捕获类型错误:无法读取属性';选择开始';未定义的';反对
我有一个可以工作的格式化程序,可以将基本的html元素插入到textarea标签上选择的文本中。 但现在我必须有一套按钮,可以在几个文本区域中显示。当我尝试对对象执行此操作时,我得到“UncaughtTypeError:无法读取未定义”错误的属性“selectionStart”到每个连接的textarea对象Javascript ';未捕获类型错误:无法读取属性';选择开始';未定义的';反对,javascript,html,dom,Javascript,Html,Dom,我有一个可以工作的格式化程序,可以将基本的html元素插入到textarea标签上选择的文本中。 但现在我必须有一套按钮,可以在几个文本区域中显示。当我尝试对对象执行此操作时,我得到“UncaughtTypeError:无法读取未定义”错误的属性“selectionStart”到每个连接的textarea对象 function Formatter(velem, vb_h, vb_b, vb_i, vb_a, vb_img) // args: textarea elem to connect, h
function Formatter(velem, vb_h, vb_b, vb_i, vb_a, vb_img)
// args: textarea elem to connect, header button, bold button, italic button, link button and image button
{
if(!velem || !vb_h || !vb_b || !vb_i || !vb_a || !vb_img)
alert("NULL argument!");
this.elem = velem;
this.b_h = vb_h;
this.b_b = vb_b;
this.b_i = vb_i;
this.b_a = vb_a;
this.b_img = vb_img;
this.f_h = function()
{
if (this.elem.selectionStart != undefined)
{
var startPos = this.elem.selectionStart;
var endPos = this.elem.selectionEnd;
var selectedText = this.elem.value.substring(startPos, endPos);
this.elem.value = this.elem.value.substring(0, startPos) + '<h1>' + selectedText + '</h1>' + this.elem.value.substring(endPos);
}
}
this.f_b = function()
{
if (this.elem.selectionStart != undefined)
{
var startPos = this.elem.selectionStart;
var endPos = this.elem.selectionEnd;
var selectedText = this.elem.value.substring(startPos, endPos);
this.elem.value = this.elem.value.substring(0, startPos) + '<b>' + selectedText + '</b>' + this.elem.value.substring(endPos);
}
}
this.f_i = function()
{
if (this.elem.selectionStart != undefined)
{
var startPos = this.elem.selectionStart;
var endPos = this.elem.selectionEnd;
var selectedText = this.elem.value.substring(startPos, endPos);
this.elem.value = this.elem.value.substring(0, startPos) + '<i>' + selectedText + '</i>' + this.elem.value.substring(endPos);
}
}
this.f_a = function()
{
if (this.elem.selectionStart != undefined)
{
var startPos = this.elem.selectionStart;
var endPos = this.elem.selectionEnd;
var selectedText = this.elem.value.substring(startPos, endPos);
var name = prompt("Podaj nazwę dla tego linku: ", "link");
this.elem.value = this.elem.value.substring(0, startPos) + '<a href="' + selectedText + '">' + name + '</a>' + this.elem.value.substring(endPos);
}
}
this.f_img = function()
{
if (this.elem.selectionStart != undefined)
{
var startPos = this.elem.selectionStart;
var endPos = this.elem.selectionEnd;
var selectedText = this.elem.value.substring(startPos, endPos);
this.elem.value = this.elem.value.substring(0, startPos) + '<img src="' + selectedText + '" />' + this.elem.value.substring(endPos);
}
}
this.b_h.addEventListener('click', this.f_h);
this.b_b.addEventListener('click', this.f_b);
this.b_i.addEventListener('click', this.f_i);
this.b_a.addEventListener('click', this.f_a);
this.b_img.addEventListener('click', this.f_img);
}
函数格式化程序(velem、vb_h、vb_b、vb_i、vb_a、vb_img)
//参数:要连接的文本区域元素、标题按钮、粗体按钮、斜体按钮、链接按钮和图像按钮
{
如果(!velem | | |!vb|h | |!vb|b |!vb|i |!vb|a |!vb|img)
警报(“空参数!”);
this.elem=velem;
this.b_h=vb_h;
this.b_b=vb_b;
this.b_i=vb_i;
this.b_a=vb_a;
this.b_img=vb_img;
this.f_h=函数()
{
if(this.elem.selectionStart!=未定义)
{
var startPos=this.elem.selectionStart;
var endPos=this.elem.selectionEnd;
var selectedText=this.elem.value.substring(startPos,endPos);
this.elem.value=this.elem.value.substring(0,startPos)+''+selectedText++''+this.elem.value.substring(endPos);
}
}
this.f_b=函数()
{
if(this.elem.selectionStart!=未定义)
{
var startPos=this.elem.selectionStart;
var endPos=this.elem.selectionEnd;
var selectedText=this.elem.value.substring(startPos,endPos);
this.elem.value=this.elem.value.substring(0,startPos)+''+selectedText++''+this.elem.value.substring(endPos);
}
}
this.f_i=函数()
{
if(this.elem.selectionStart!=未定义)
{
var startPos=this.elem.selectionStart;
var endPos=this.elem.selectionEnd;
var selectedText=this.elem.value.substring(startPos,endPos);
this.elem.value=this.elem.value.substring(0,startPos)+''+selectedText++''+this.elem.value.substring(endPos);
}
}
this.f_a=函数()
{
if(this.elem.selectionStart!=未定义)
{
var startPos=this.elem.selectionStart;
var endPos=this.elem.selectionEnd;
var selectedText=this.elem.value.substring(startPos,endPos);
变量名称=提示(“Podaj nazwędla tego linku:”,“link”);
this.elem.value=this.elem.value.substring(0,startPos)+''+this.elem.value.substring(endPos);
}
}
this.f_img=函数()
{
if(this.elem.selectionStart!=未定义)
{
var startPos=this.elem.selectionStart;
var endPos=this.elem.selectionEnd;
var selectedText=this.elem.value.substring(startPos,endPos);
this.elem.value=this.elem.value.substring(0,startPos)+''+this.elem.value.substring(endPos);
}
}
this.b_h.addEventListener('click',this.f_h');
this.b_b.addEventListener('click',this.f_b');
this.b_i.addEventListener('click',this.f_i');
this.b_a.addEventListener('click',this.f_a);
this.b_img.addEventListener('单击',this.f_img);
}
和HTML格式:
Numer testu: <input type="number" name="testnum" id="testnum" /><br /><br />
<fieldset><legend>Formatowanie</legend>
<button type="button" id="b2_h1" >Nagłówek</button> <button type="button" id="b2_b" ><b>Pogrubienie</b></button> <button type="button" id="b2_i" ><i>Pochylenie</i></button> <button type="button" id="b2_a" >Link</button> <button type="button" id="b2_img" >Obrazek</button>
<br />
</fieldset><br />
<fieldset><legend>Nowe pytanie</legend>
Pytanie:<br />
<textarea id="q_q" cols="95" rows="2"></textarea><br />
Odpowiedź A:<br />
<textarea id="q_aa" cols="95" rows="2"></textarea><br />
Odpowiedź B:<br />
<textarea id="q_ab" cols="95" rows="2"></textarea><br />
Odpowiedź C:<br />
<textarea id="q_ac" cols="95" rows="2"></textarea><br />
Prawidłowa odpowiedź:<br />
<input type="radio" id="q_an" value="A"/>A <input type="radio" id="q_an" value="B"/>B <input type="radio" id="q_an" value="C" />C<br />
<button type="button">OK</button>
</fieldset><br />
Podgląd: <br />
<textarea name="val2" id="val2" cols="95" rows="50"></textarea>
<script type="text/javascript">
var b2_h1 = document.getElementById('b2_h1'),
b2_b = document.getElementById('b2_b'),
b2_i = document.getElementById('b2_i'),
b2_a = document.getElementById('b2_a'),
b2_img = document.getElementById('b2_img');
var f2 = new Formatter(document.getElementById("q_q"), b2_h1, b2_b, b2_i, b2_a, b2_img);
var f2 = new Formatter(document.getElementById("q_aa"), b2_h1, b2_b, b2_i, b2_a, b2_img);
var f3 = new Formatter(document.getElementById("q_ab"), b2_h1, b2_b, b2_i, b2_a, b2_img);
var f4 = new Formatter(document.getElementById("q_ac"), b2_h1, b2_b, b2_i, b2_a, b2_img);
var f5 = new Formatter(document.getElementById("q_an"), b2_h1, b2_b, b2_i, b2_a, b2_img);
var f6 = new Formatter(document.getElementById("val2"), b2_h1, b2_b, b2_i, b2_a, b2_img);
</script>
Numer testu:
甲酸苯胺
Nagłówek Pogrubienie Pochylenie Link Obrazek
诺维皮塔尼
皮塔尼:
OdpowiedźA:
OdpowiedźB:
OdpowiedźC:
Prawidłowa odpowiedź:
A B C
好啊
Podgląd:
var b2_h1=document.getElementById('b2_h1'),
b2_b=document.getElementById('b2_b'),
b2_i=document.getElementById('b2_i'),
b2_a=document.getElementById('b2_a'),
b2_img=document.getElementById('b2_img');
var f2=新的格式化程序(document.getElementById(“q_q”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
var f2=新的格式化程序(document.getElementById(“q_aa”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
var f3=新的格式化程序(document.getElementById(“q_ab”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
var f4=新的格式化程序(document.getElementById(“q_ac”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
var f5=新的格式化程序(document.getElementById(“q_-an”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
var f6=新的格式化程序(document.getElementById(“val2”)、b2_h1、b2_b、b2_i、b2_a、b2_img);
(很抱歉在代码中使用波兰语,但我不想翻译它,这并不重要)在事件处理程序中(this.f_h et al)
此
将是事件元素而不是函数对象。因此我需要传递此
(或元素
)作为所有f_xxx?的参数,我不能使用这个解决方案,因为有许多格式化程序对象。在本主题中,我们编写了使用jQuery来完成这项工作的代码。怎样