You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 2-ui/99-ui-misc/02-selection-range/article.md
+31-33Lines changed: 31 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,22 +1,23 @@
1
1
کتابخانه ها:
2
2
- d3
3
3
- domtree
4
+
4
5
---
5
6
6
7
# Selection and Range
7
8
8
9
9
-
جاوااسکریپت میتواند به یک انتخاب موجود دسترسی داشته باشد، گرههای DOM را بهطور کلی یا جزئی انتخاب یا لغو انتخاب کند، محتوای انتخابشده را از سند حذف کند، آن را در یک برچسب قرار دهد و غیره.
10
+
در این فصل به انتخاب در سند و همچنین انتخاب در فیلدهای فرم، مانند `<input>` خواهیم پرداخت.
10
11
11
-
میتوانید دستور العملهایی برای کارهای رایج در انتهای فصل، در بخش "Summary" بیابید. شاید این نیازهای فعلی شما را پوشش دهد، اما اگر متن کامل را بخوانید، خیلی بیشتر به دست خواهید آورد.
12
+
جاوا اسکریپت می تواند به یک انتخاب موجود دسترسی داشته باشد، گره های DOM را به طور کلی یا جزئی انتخاب یا لغو انتخاب کند، محتوای انتخاب شده را از سند حذف کند، آن را در یک برچسب قرار دهد و غیره.
12
13
13
-
درک اشیاء زیربنایی `Range` و`Selection` آسان است، و پس از آن برای اینکه آنها را به آنچه میخواهید انجام دهند، به هیچ دستور العملی نیاز نخواهید داشت.
14
+
میتوانید دستور العملهایی برای کارهای رایج در انتهای فصل، در بخش "Summary" بیابید. شاید این نیازهای فعلی شما را پوشش دهد، اما اگر متن کامل را بخوانید، خیلی بیشتر به دست خواهید آورد.
14
15
16
+
درک اشیاء زیربنایی `Range` و `Selection` آسان است، و پس از آن برای اینکه آنها را به آنچه میخواهید انجام دهند، به هیچ دستور العملی نیاز نخواهید داشت.
15
17
## Range
16
18
17
19
فهوم اصلی انتخاب [Range](https://dom.spec.whatwg.org/#ranges) است، که اساساً یک جفت "boundary points"است: شروع محدوده و پایان محدوده.
18
20
19
-
20
21
یک `Range` object بدون پارامتر ساخته می شود:
21
22
22
23
```js
@@ -31,7 +32,6 @@ let range = new Range();
31
32
32
33
نکته جالب این است که آرگومان اول `node` در هر دو روش می تواند یک text node یا یelement node عنصر باشد و معنای آرگومان دوم به آن بستگی دارد.
33
34
34
-
35
35
**اگر `node` یک text nodeاست، `offset` باید موقعیتی در متن آن باشد.**
36
36
37
37
به عنوان مثال، با توجه به عنصر `<p>Hello</p>`، میتوانیم محدوده حاوی حروف «ll» را به صورت زیر ایجاد کنیم:
@@ -50,8 +50,8 @@ let range = new Range();
50
50
51
51
52
52
در اینجا اولین فرزند `<p>` را می گیریم (این text node است) و موقعیت های متن را در داخل آن مشخص می کنیم:
53
-
54
53

54
+
55
55
### Selecting element nodes
56
56
57
57
@@ -60,7 +60,6 @@ let range = new Range();
60
60
این برای ایجاد محدوده هایی که شامل گره ها به عنوان یک کل هستند، مفید است، نه اینکه در جایی در متن خود متوقف شوند.
61
61
62
62
به عنوان مثال، ما یک قطعه سند پیچیده تر داریم:
63
-
64
63
```html autorun
65
64
<pid="p">Example: <i>italic</i> and <b>bold</b></p>
همانطور که می بینیم، این عبارت دقیقاً از دو فرزند `<p>` با نمایه های `0` و `1` تشکیل شده است:
106
+
بیایید یک محدوده برای `"Example: <i>italic</i>"` بسازیم.
108
107
108
+
همانطور که می بینیم، این عبارت دقیقاً از دو فرزند `<p>` با نمایه های `0` و `1` تشکیل شده است:
109
109

110
110
111
-
112
111
- نقطه شروع `<p>` به عنوان `node` والد، و `0` به عنوان آفست است.
113
-
114
-
بنابراین میتوانیم آن را بهعنوان `range.setStart(p, 0)` تنظیم کنیم.
112
+
113
+
بنابراین میتوانیم آن را بهعنوان `range.setStart(p, 0)` تنظیم کنیم.
115
114
- نقطه پایانی نیز `<p>` را به عنوان `node` والد، اما `2` را به عنوان آفست دارد (محدوده تا را مشخص می کند، اما `offset` را شامل نمی شود).
116
-
117
-
بنابراین میتوانیم آن را بهعنوان `range.setEnd(p, 2)` تنظیم کنیم.
115
+
116
+
بنابراین میتوانیم آن را بهعنوان `range.setEnd(p, 2)` تنظیم کنیم.
118
117
119
118
در اینجا نسخه ی نمایشی است. اگر آن را اجرا کنید، می بینید که متن انتخاب شده است:
120
119
@@ -177,9 +176,9 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
177
176
ما قبلاً می دانیم که چگونه این کار را انجام دهیم. فقط باید شروع و پایان را به عنوان یک افست نسبی در گره های متنی تنظیم کنیم.
178
177
179
178
ما باید یک محدوده ایجاد کنیم، که:
180
-
181
179
- از موقعیت 2 در `<p>` فرزند اول شروع میشود (با گرفتن همه حرفهای اول «مثال<b>ample:</b>» به جز دو حرف اول)
182
180
- در `<b>`فرزند اول به موقعیت 3 ختم می شود (با گرفتن سه حرف اول "<b>bol</b>d"، اما نه بیشتر):
181
+
183
182
```html run
184
183
<pid="p">Example: <i>italic</i> and <b>bold</b></p>
185
184
@@ -229,6 +228,7 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
229
228
-`setStart(node, offset)` مجموعه شروع در: درست بعد از `node`.
230
229
231
230
تنظیم پایان محدوده (روش های مشابه)
231
+
232
232
-`setEnd(node, offset)` پایان را در: موقعیت `offset` در `node` تنظیم کنید
233
233
-`setEndBefore(node)` پایان را در: درست قبل از `node` تنظیم کنید
234
234
-`setEndAfter(node)` پایان را در: درست بعد از `node` تنظیم کنید
@@ -237,7 +237,6 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
237
237
238
238
در همه این روشها، `node` میتواند هم یک متن یا یک گره عنصر باشد: برای گرههای متنی، `offset` بسیاری از کاراکترها را رد میکند، در حالی که برای گرههای عنصر از بسیاری از گرههای فرزند.
239
239
240
-
241
240
حتی روش های بیشتری برای ایجاد محدوده:
242
241
-`selectNode(node)` محدوده را برای انتخاب کل `node` تنظیم کنید
243
242
-`selectNodeContents(node)` محدوده را برای انتخاب کل محتویات `node` تنظیم کنید
@@ -322,7 +321,7 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
322
321
323
322
ما ممکن است اشیاء `Range` ایجاد کنیم، آنها را به اطراف منتقل کنیم -- آنها به صورت بصری چیزی را به تنهایی انتخاب نمی کنند.
324
323
325
-
انتخاب سند با شی`Selection`نشان داده می شود که می تواند به عنوان`window.getSelection()` یا `document.getSelection()`به دست آید. یک انتخاب ممکن است شامل محدوده صفر یا بیشتر باشد. حداقل،specification](https://www.w3.org/TR/selection-api/) این را می گوید. اگرچه در عمل، فقط فایرفاکس اجازه می دهد تا با استفاده از`key:Ctrl+click` (`key:Cmd+click` برای Mac)، چندین محدوده را در سند انتخاب کنید.
324
+
انتخاب سند با شی`Selection`نشان داده میشود که میتواند به عنوان`window.getSelection()`یا`document.getSelection()`به دست آید. یک انتخاب ممکن است شامل محدوده صفر یابیشتر باشد. حداقل،specification](https://www.w3.org/TR/selection-api/) این رامیگوید.اگرچه درعمل، فقط فایرفاکس اجازه میدهد تا با استفاده از`key:Ctrl+click` (`key:Cmd+click` برای Mac)، چندین محدوده را در سند انتخاب کنید.
326
325
327
326
در اینجا یک اسکرین شات از یک انتخاب با 3 محدوده، ساخته شده در فایرفاکس آمده است:
328
327
@@ -336,8 +335,8 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
336
335
337
336
## Selection properties
338
337
339
-
340
338
همانطور که گفته شد، یک انتخاب ممکن است در تئوری شامل چندین محدوده باشد. ما می توانیم این اشیاء محدوده را با استفاده از روش بدست آوریم:
339
+
341
340
-`getRangeAt(i)` -- محدوده i-ام را دریافت کنید که از `0` شروع می شود. در همه مرورگرها به جز فایرفاکس، فقط «0» استفاده می شود.
342
341
343
342
همچنین، ویژگی هایی وجود دارد که اغلب راحتی بهتری را ارائه می دهند.
@@ -440,13 +439,13 @@ As text: <span id="astext"></span>
440
439
## Selection methods
441
440
442
441
ا می توانیم با افزودن/حذف محدوده ها با انتخاب کار کنیم:
442
+
443
443
-`getRangeAt(i)`-- محدوده i-ام را دریافت کنید که از `0` شروع می شود. در همه مرورگرها به جز فایرفاکس، فقط `0` استفاده می شود.
444
444
-`addRange(range)`--`range` را به انتخاب اضافه کنید. همه مرورگرها به جز فایرفاکس تماس را نادیده می گیرند، در صورتی که انتخاب از قبل دارای یک محدوده مرتبط باشد.
445
445
-`removeRange(range)`--`range` را از انتخاب حذف کنید.
446
446
-`removeAllRanges()`-- حذف همه محدوده ها.
447
447
-`empty()`-- نام مستعار `removeAllRanges`.
448
448
449
-
450
449
همچنین روشهای آسانی برای دستکاری مستقیم محدوده انتخاب، بدون فراخوانی `Range` میانی وجود دارد:
451
450
452
451
-`collapse(node, offset)`-- محدوده انتخاب شده را با یک محدوده جدید جایگزین کنید که در "گره" داده شده شروع و پایان می یابد، در موقعیت "offset".
@@ -459,8 +458,8 @@ As text: <span id="astext"></span>
459
458
-`deleteFromDocument()`-- محتوای انتخاب شده را از سند حذف کنید.
460
459
-`containsNode(node, allowPartialContainment = false)`-- بررسی می کند که آیا انتخاب شامل "node" است (تا حدی اگر آرگومان دوم "true" باشد)
461
460
462
-
463
461
برای اکثر وظایف، این روشها خوب هستند، نیازی به دسترسی به شی `Range` زیرین نیست.
462
+
464
463
به عنوان مثال، انتخاب کل محتوای پاراگراف `<p>`:
465
464
466
465
```html run
@@ -501,15 +500,14 @@ The exception is some selection methods, that replace the existing selection, su
501
500
-`input.selectionEnd`-- موقعیت انتهای انتخاب (قابل نوشتن)،
502
501
-`input.selectionDirection`-- جهت انتخاب، یکی از:"backward"، "backward" یا "none" (به عنوان مثال اگر با دوبار کلیک ماوس انتخاب شده باشد)،
503
502
504
-
505
503
(رویداد ها)Events:
506
504
-`input.onselect`-- هنگامی که چیزی انتخاب می شود فعال می شود.
507
505
508
506
متد ها:
507
+
509
508
-`input.select()`-- همه چیز را در کنترل متن انتخاب می کند (می تواند `textarea` به جای `input` باشد)
510
509
-`input.setSelectionRange(start, end, [direction])`-- انتخاب را تغییر دهید تا از موقعیت `شروع` تا `"پایان` در جهت معین (اختیاری) باشد.
511
510
-`input.setRangeText(replacement, [start], [end], [selectionMode])`-- یک محدوده از متن را با متن جدید جایگزین کنید.
512
-
513
511
514
512
آرگومان های اختیاری`«شروع` و`«پایان`، در صورت ارائه، محدوده شروع و پایان را تنظیم می کنند، در غیر این صورت از انتخاب کاربر استفاده می شود.
515
513
@@ -542,18 +540,18 @@ From <input id="from" disabled> – To <input id="to" disabled>
542
540
```
543
541
544
542
لطفا توجه داشته باشید:
545
-
546
-
547
543
- وقتی چیزی انتخاب میشود، `onselect` فعال میشود، اما وقتی انتخاب حذف میشود نه.
548
544
- طبق [spec](https://w3c.github.io/selection-api/#dfn-selectionchange)، رویداد `document.onselectionchange` نباید برای انتخابهای داخل یک کنترل فرم فعال شود، زیرا به مرتبط نیست انتخاب `document` و محدوده برخی از مرورگرها آن را تولید می کنند، اما ما نباید به آن تکیه کنیم.
549
-
### Example: moving cursor
550
545
546
+
547
+
### Example: moving cursor
551
548
552
549
میتوانیم `selectionStart` و `selectionEnd` را تغییر دهیم که انتخاب را تنظیم میکند.
553
550
554
551
یک مورد مهم لبه زمانی است که `selectionStart` و `selectionEnd` با هم برابر باشند. سپس دقیقاً موقعیت مکان نما است. یا، برای بازنویسی، وقتی چیزی انتخاب نشده است، انتخاب در موقعیت مکان نما جمع می شود.
555
552
556
553
بنابراین، با تنظیم `selectionStart` و `selectionEnd` روی یک مقدار، مکاننما را حرکت میدهیم.
554
+
557
555
مثلا:
558
556
559
557
```html run autorun
@@ -575,10 +573,10 @@ Focus on me, the cursor will be at position 10.
575
573
576
574
### Example: modifying selection
577
575
578
-
579
576
برای تغییر محتوای انتخابی، میتوانیم از روش `input.setRangeText()` استفاده کنیم. البته، میتوانیم `selectionStart/End` را بخوانیم و با آگاهی از انتخاب، زیررشته مربوط به `value` را تغییر دهیم، اما `setRangeText` قدرتمندتر و اغلب راحتتر است.
580
577
581
578
این یک روش تا حدودی پیچیده است. در ساده ترین شکل تک آرگومان خود، جایگزین محدوده انتخابی کاربر می شود و انتخاب را حذف می کند.
579
+
582
580
به عنوان مثال، در اینجا انتخاب کاربر با `*...*` پیچیده می شود:
583
581
584
582
```html run autorun
@@ -639,7 +637,7 @@ button.onclick = () => {
639
637
640
638
## Making unselectable
641
639
642
-
2. برای غیرقابل انتخاب کردن چیزی، سه راه وجود دارد:
این اجازه نمیدهد انتخاب از «elem» شروع شود. اما کاربر ممکن است انتخاب را از جای دیگری شروع کند و `elem` را در آن قرار دهد.
657
654
658
-
سپس `elem` به بخشی از `document.getSelection()` تبدیل میشود، بنابراین انتخاب در واقع اتفاق میافتد، اما محتوای آن معمولاً در کپی-پیست نادیده گرفته میشود.
655
+
سپس `elem` به بخشی از `document.getSelection()` تبدیل میشود، بنابراین انتخاب در واقع اتفاق میافتد، اما محتوای آن معمولاً در کپی-پیست نادیده گرفته میشود.
659
656
660
657
661
-
4.3. از اقدام پیشفرض در رویدادهای `onselectstart` یا `mousedown` جلوگیری کنید.
658
+
2. از اقدام پیشفرض در رویدادهای `onselectstart` یا `mousedown` جلوگیری کنید.
این کار از شروع انتخاب روی `elem` جلوگیری میکند، اما بازدیدکننده ممکن است آن را از عنصر دیگری شروع کند و سپس به `elem` گسترش دهد.
672
669
673
670
زمانی که کنترلکننده رویداد دیگری در همان عملکرد وجود دارد که انتخاب را فعال میکند، راحت است (e.g. `mousedown`). بنابراین، برای جلوگیری از تضاد، انتخاب را غیرفعال میکنیم و همچنان اجازه میدهیم محتوای `elem` کپی شود.
674
-
5. همچنین میتوانیم انتخاب post-factum را بعد از اینکه با `document.getSelection().empty()` رخ داد پاک کنیم. این به ندرت استفاده می شود، زیرا باعث چشمک زدن ناخواسته با ظاهر شدن انتخاب می شود - ناپدید می شود.
675
-
671
+
672
+
3. همچنین میتوانیم انتخاب post-factum را بعد از اینکه با `document.getSelection().empty()` رخ داد پاک کنیم. این به ندرت استفاده می شود، زیرا باعث چشمک زدن ناخواسته با ظاهر شدن انتخاب می شود - ناپدید می شود.
و در نهایت، در مورد مکان نما. موقعیت مکان نما در عناصر قابل ویرایش، مانند `<textarea>` همیشه در ابتدا یا انتهای انتخاب است. میتوانیم با تنظیم `elem.selectionStart` و `elem.selectionEnd` از آن برای به دست آوردن موقعیت مکاننما یا حرکت مکاننما استفاده کنیم.
0 commit comments