كيفية الحصول على النص المحدد من سيطرة النص مع جافا سكريبت
-
07-07-2019 - |
سؤال
ولدي نص وزر الارتباط. عندما أكتب بعض النصوص، ثم حدد بعضهم ومن ثم انقر فوق زر الرابط، يجب أن يكون النص المحدد من نص العرض مع MESSAGEBOX.
وكيف يمكنني أن أفعل ذلك؟
وعندما تضغط على زر إرسال لمربع النص أدناه، يجب مربع الرسالة تظهر أبجد هوز. بسبب عدم تحديد "هوز أبجد" في المنطقة.
إذا قمت بتحديد أي نص من الصفحة وانقر على زر أنها تعمل تقديم، ولكن إذا أنا أكتب النص إلى النص وجعله، انها ليست. لأنه عندما كنت فوق إلى مساحة أخرى، يتم إلغاء اختيار النص.
والآن المشكلة هي أنه، عندما حدد النص من النص وانقر على أي عنصر تحكم آخر أو في الفضاء، والنص الذي تم تحديده ويجب أن يزال محددا.
وكيف يتم ذلك؟
المحلول
وOK، هنا هو رمز لدي:
function ShowSelection()
{
var textComponent = document.getElementById('Editor');
var selectedText;
if (textComponent.selectionStart !== undefined)
{// Standards Compliant Version
var startPos = textComponent.selectionStart;
var endPos = textComponent.selectionEnd;
selectedText = textComponent.value.substring(startPos, endPos);
}
else if (document.selection !== undefined)
{// IE Version
textComponent.focus();
var sel = document.selection.createRange();
selectedText = sel.text;
}
alert("You selected: " + selectedText);
}
والمشكلة، على الرغم من أن يتم إعطاء رمز أعطي لIE على الكثير من المواقع، وأنا لا يمكن أن تجعل من العمل على نسختي من IE6 على نظام بلدي الحالي. ربما انها ستعمل بالنسبة لك، وهذا هو السبب في أنني تعطيه.
خدعة كنت تبحث عن وربما الدعوة .focus ()، لتقديم الأفضل لناحية النص التركيز حتى يتم إعادة تنشيط التحديد.
و[تحديث] حصلت على النتيجة الصحيحة (محتوى اختيار) مع الحدث عند_ضغط_مفتاح:
document.onkeydown = function (e) { ShowSelection(); }
وهكذا رمز هو الصحيح. مرة أخرى، المسألة لللحصول على الاختيار على انقر على زر ... I الاستمرار في البحث.
و[تحديث] حصلت أي نجاح مع زر تعادل مع علامة li
، لأننا عندما اضغط عليه، IE إلى إلغاء اختيار السابقة. يعمل رمز أعلاه مع زر input
بسيط، على الرغم من ...
نصائح أخرى
وهنا الحل أبسط من ذلك بكثير، استنادا إلى حقيقة أن اختيار النص يحدث على mouseup، لذلك نضيف المستمع الحدث لذلك:
document.querySelector('textarea').addEventListener('mouseup', function () {
window.mySelection = this.value.substring(this.selectionStart, this.selectionEnd)
// window.getSelection().toString();
});
<textarea>
Select some text
</textarea>
<a href="#" onclick=alert(mySelection);>Click here to display the selected text</a>
وهذا يعمل في جميع المتصفحات.
إذا كنت تريد أيضا للتعامل مع اختيار طريق لوحة المفاتيح، إضافة المستمع حدث آخر لkeyup
، مع نفس الرمز.
إذا لم يكن لهذا فايرفوكس علة قدم الظهر في عام 2001 (نعم، قبل 14 عاما)، ونحن يمكن أن تحل محل القيمة التي تم تعيينها لwindow.mySelection
مع window.getSelection().toString()
، الذي يعمل في IE9 + وجميع المتصفحات الحديثة، وأيضا يحصل على هذا الاختيار في مناطق غير تيكستاريا للDOM.
function disp() {
var text = document.getElementById("text");
var t = text.value.substr(text.selectionStart, text.selectionEnd - text.selectionStart);
alert(t);
}
<TEXTAREA id="text">Hello, How are You?</TEXTAREA><BR>
<INPUT type="button" onclick="disp()" value="Select text and click here" />
لأوبرا، فايرفوكس وسفاري، يمكنك استخدام الدالة التالية:
function getTextFieldSelection(textField) {
return textField.value.substring(textField.selectionStart, textField.selectionEnd);
}
وبعد ذلك، يمكنك فقط تمرير إشارة إلى عنصر حقل النص (مثل جزء النص أو إدخال عنصر) إلى وظيفة:
alert(getTextFieldSelection(document.getElementsByTagName("textarea")[0]));
وأو، إذا كنت تريد
HTMLTextAreaElement.prototype.getSelection = HTMLInputElement.prototype.getSelection = function() {
var ss = this.selectionStart;
var se = this.selectionEnd;
if (typeof ss === "number" && typeof se === "number") {
return this.value.substring(this.selectionStart, this.selectionEnd);
}
return "";
};
وبعد ذلك، كنت تفعل فقط:
alert(document.getElementsByTagName("textarea")[0].getSelection());
alert(document.getElementsByTagName("input")[0].getSelection());
وعلى سبيل المثال.
ومروحة كبيرة من مسج-textrange
وفيما يلي صغير جدا، ومكتفية ذاتيا، مثلا. أسفل حمولة مسج-textrange.js ونسخ إلى نفس المجلد.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery-textrange</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="jquery-textrange.js"></script>
<script>
/* run on document load **/
$(document).ready(function() {
/* run on any change of 'textarea' **/
$('#textareaId').bind('updateInfo keyup mousedown mousemove mouseup', function() {
/* The magic is on this line **/
var range = $(this).textrange();
/* Stuff into selectedId. I wanted to store this is a input field so it can be submitted in a form. **/
$('#selectedId').val(range.text);
});
});
</script>
</head>
<body>
The smallest example possible using
<a href="https://github.com/dwieeb/jquery-textrange">
jquery-textrange
</a><br/>
<textarea id="textareaId" >Some random content.</textarea><br/>
<input type="text" id="selectedId" ></input>
</body>
</html>