Skip to content

Commit 2ab1a41

Browse files
authored
Update article.md
1 parent 4d6d41b commit 2ab1a41

1 file changed

Lines changed: 31 additions & 33 deletions

File tree

2-ui/99-ui-misc/02-selection-range/article.md

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
کتابخانه ها:
22
- d3
33
- domtree
4+
45
---
56

67
# Selection and Range
78

89

9-
جاوااسکریپت می‌تواند به یک انتخاب موجود دسترسی داشته باشد، گره‌های DOM را به‌طور کلی یا جزئی انتخاب یا لغو انتخاب کند، محتوای انتخاب‌شده را از سند حذف کند، آن را در یک برچسب قرار دهد و غیره.
10+
در این فصل به انتخاب در سند و همچنین انتخاب در فیلدهای فرم، مانند `<input>` خواهیم پرداخت.
1011

11-
می‌توانید دستور العمل‌هایی برای کارهای رایج در انتهای فصل، در بخش "Summary" بیابید. شاید این نیازهای فعلی شما را پوشش دهد، اما اگر متن کامل را بخوانید، خیلی بیشتر به دست خواهید آورد.
12+
جاوا اسکریپت می تواند به یک انتخاب موجود دسترسی داشته باشد، گره های DOM را به طور کلی یا جزئی انتخاب یا لغو انتخاب کند، محتوای انتخاب شده را از سند حذف کند، آن را در یک برچسب قرار دهد و غیره.
1213

13-
درک اشیاء زیربنایی `Range` و`Selection` آسان است، و پس از آن برای اینکه آنها را به آنچه می‌خواهید انجام دهند، به هیچ دستور العملی نیاز نخواهید داشت.
14+
می‌توانید دستور العمل‌هایی برای کارهای رایج در انتهای فصل، در بخش "Summary" بیابید. شاید این نیازهای فعلی شما را پوشش دهد، اما اگر متن کامل را بخوانید، خیلی بیشتر به دست خواهید آورد.
1415

16+
درک اشیاء زیربنایی `Range` و `Selection` آسان است، و پس از آن برای اینکه آنها را به آنچه می‌خواهید انجام دهند، به هیچ دستور العملی نیاز نخواهید داشت.
1517
## Range
1618

1719
فهوم اصلی انتخاب [Range](https://dom.spec.whatwg.org/#ranges) است، که اساساً یک جفت "boundary points"است: شروع محدوده و پایان محدوده.
1820

19-
2021
یک `Range` object بدون پارامتر ساخته می شود:
2122

2223
```js
@@ -31,7 +32,6 @@ let range = new Range();
3132

3233
نکته جالب این است که آرگومان اول `node` در هر دو روش می تواند یک text node یا یelement node عنصر باشد و معنای آرگومان دوم به آن بستگی دارد.
3334

34-
3535
**اگر `node` یک text nodeاست، `offset` باید موقعیتی در متن آن باشد.**
3636

3737
به عنوان مثال، با توجه به عنصر `<p>Hello</p>`، می‌توانیم محدوده حاوی حروف «ll» را به صورت زیر ایجاد کنیم:
@@ -50,8 +50,8 @@ let range = new Range();
5050

5151

5252
در اینجا اولین فرزند `<p>` را می گیریم (این text node است) و موقعیت های متن را در داخل آن مشخص می کنیم:
53-
5453
![](range-hello-1.svg)
54+
5555
### Selecting element nodes
5656

5757

@@ -60,7 +60,6 @@ let range = new Range();
6060
این برای ایجاد محدوده هایی که شامل گره ها به عنوان یک کل هستند، مفید است، نه اینکه در جایی در متن خود متوقف شوند.
6161

6262
به عنوان مثال، ما یک قطعه سند پیچیده تر داریم:
63-
6463
```html autorun
6564
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
6665
```
@@ -104,17 +103,17 @@ drawHtmlTree(selectPDomtree, 'div.select-p-domtree', 690, 320);
104103
</script>
105104

106105

107-
همانطور که می بینیم، این عبارت دقیقاً از دو فرزند `<p>` با نمایه های `0` و `1` تشکیل شده است:
106+
بیایید یک محدوده برای `"Example: <i>italic</i>"` بسازیم.
108107

108+
همانطور که می بینیم، این عبارت دقیقاً از دو فرزند `<p>` با نمایه های `0` و `1` تشکیل شده است:
109109
![](range-example-p-0-1.svg)
110110

111-
112111
- نقطه شروع `<p>` به عنوان `node` والد، و `0` به عنوان آفست است.
113-
114-
بنابراین می‌توانیم آن را به‌عنوان `range.setStart(p, 0)` تنظیم کنیم.
112+
113+
بنابراین می‌توانیم آن را به‌عنوان `range.setStart(p, 0)` تنظیم کنیم.
115114
- نقطه پایانی نیز `<p>` را به عنوان `node` والد، اما `2` را به عنوان آفست دارد (محدوده تا را مشخص می کند، اما `offset` را شامل نمی شود).
116-
117-
بنابراین می‌توانیم آن را به‌عنوان `range.setEnd(p, 2)` تنظیم کنیم.
115+
116+
بنابراین می‌توانیم آن را به‌عنوان `range.setEnd(p, 2)` تنظیم کنیم.
118117

119118
در اینجا نسخه ی نمایشی است. اگر آن را اجرا کنید، می بینید که متن انتخاب شده است:
120119

@@ -177,9 +176,9 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
177176
ما قبلاً می دانیم که چگونه این کار را انجام دهیم. فقط باید شروع و پایان را به عنوان یک افست نسبی در گره های متنی تنظیم کنیم.
178177

179178
ما باید یک محدوده ایجاد کنیم، که:
180-
181179
- از موقعیت 2 در `<p>` فرزند اول شروع می‌شود (با گرفتن همه حرف‌های اول «مثال<b>ample:</b>» به جز دو حرف اول)
182180
- در `<b>`فرزند اول به موقعیت 3 ختم می شود (با گرفتن سه حرف اول "<b>bol</b>d"، اما نه بیشتر):
181+
183182
```html run
184183
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
185184

@@ -229,6 +228,7 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
229228
- `setStart(node, offset)` مجموعه شروع در: درست بعد از `node`.
230229

231230
تنظیم پایان محدوده (روش های مشابه)
231+
232232
- `setEnd(node, offset)` پایان را در: موقعیت `offset` در `node` تنظیم کنید
233233
- `setEndBefore(node)` پایان را در: درست قبل از `node` تنظیم کنید
234234
- `setEndAfter(node)` پایان را در: درست بعد از `node` تنظیم کنید
@@ -237,7 +237,6 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
237237

238238
در همه این روش‌ها، `node` می‌تواند هم یک متن یا یک گره عنصر باشد: برای گره‌های متنی، `offset` بسیاری از کاراکترها را رد می‌کند، در حالی که برای گره‌های عنصر از بسیاری از گره‌های فرزند.
239239

240-
241240
حتی روش های بیشتری برای ایجاد محدوده:
242241
- `selectNode(node)` محدوده را برای انتخاب کل `node` تنظیم کنید
243242
- `selectNodeContents(node)` محدوده را برای انتخاب کل محتویات `node` تنظیم کنید
@@ -322,7 +321,7 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
322321

323322
ما ممکن است اشیاء `Range` ایجاد کنیم، آنها را به اطراف منتقل کنیم -- آنها به صورت بصری چیزی را به تنهایی انتخاب نمی کنند.
324323

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)، چندین محدوده را در سند انتخاب کنید.
326325

327326
در اینجا یک اسکرین شات از یک انتخاب با 3 محدوده، ساخته شده در فایرفاکس آمده است:
328327

@@ -336,8 +335,8 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
336335

337336
## Selection properties
338337

339-
340338
همانطور که گفته شد، یک انتخاب ممکن است در تئوری شامل چندین محدوده باشد. ما می توانیم این اشیاء محدوده را با استفاده از روش بدست آوریم:
339+
341340
- `getRangeAt(i)` -- محدوده i-ام را دریافت کنید که از `0` شروع می شود. در همه مرورگرها به جز فایرفاکس، فقط «0» استفاده می شود.
342341

343342
همچنین، ویژگی هایی وجود دارد که اغلب راحتی بهتری را ارائه می دهند.
@@ -440,13 +439,13 @@ As text: <span id="astext"></span>
440439
## Selection methods
441440
442441
ا می توانیم با افزودن/حذف محدوده ها با انتخاب کار کنیم:
442+
443443
- `getRangeAt(i)` -- محدوده i-ام را دریافت کنید که از `0` شروع می شود. در همه مرورگرها به جز فایرفاکس، فقط `0` استفاده می شود.
444444
- `addRange(range)` -- `range` را به انتخاب اضافه کنید. همه مرورگرها به جز فایرفاکس تماس را نادیده می گیرند، در صورتی که انتخاب از قبل دارای یک محدوده مرتبط باشد.
445445
- `removeRange(range)` -- `range` را از انتخاب حذف کنید.
446446
- `removeAllRanges()` -- حذف همه محدوده ها.
447447
- `empty()` -- نام مستعار `removeAllRanges`.
448448
449-
450449
همچنین روش‌های آسانی برای دستکاری مستقیم محدوده انتخاب، بدون فراخوانی `Range` میانی وجود دارد:
451450
452451
- `collapse(node, offset)` -- محدوده انتخاب شده را با یک محدوده جدید جایگزین کنید که در "گره" داده شده شروع و پایان می یابد، در موقعیت "offset".
@@ -459,8 +458,8 @@ As text: <span id="astext"></span>
459458
- `deleteFromDocument()` -- محتوای انتخاب شده را از سند حذف کنید.
460459
- `containsNode(node, allowPartialContainment = false)` -- بررسی می کند که آیا انتخاب شامل "node" است (تا حدی اگر آرگومان دوم "true" باشد)
461460
462-
463461
برای اکثر وظایف، این روش‌ها خوب هستند، نیازی به دسترسی به شی `Range` زیرین نیست.
462+
464463
به عنوان مثال، انتخاب کل محتوای پاراگراف `<p>`:
465464
466465
```html run
@@ -501,15 +500,14 @@ The exception is some selection methods, that replace the existing selection, su
501500
- `input.selectionEnd` -- موقعیت انتهای انتخاب (قابل نوشتن)،
502501
- `input.selectionDirection` -- جهت انتخاب، یکی از: "backward"، "backward" یا "none" (به عنوان مثال اگر با دوبار کلیک ماوس انتخاب شده باشد)،
503502
504-
505503
(رویداد ها)Events:
506504
- `input.onselect` -- هنگامی که چیزی انتخاب می شود فعال می شود.
507505
508506
متد ها:
507+
509508
- `input.select()` -- همه چیز را در کنترل متن انتخاب می کند (می تواند `textarea` به جای `input` باشد)
510509
- `input.setSelectionRange(start, end, [direction])` -- انتخاب را تغییر دهید تا از موقعیت `شروع` تا `"پایان` در جهت معین (اختیاری) باشد.
511510
- `input.setRangeText(replacement, [start], [end], [selectionMode])` -- یک محدوده از متن را با متن جدید جایگزین کنید.
512-
513511
514512
آرگومان های اختیاری`«شروع` و`«پایان`، در صورت ارائه، محدوده شروع و پایان را تنظیم می کنند، در غیر این صورت از انتخاب کاربر استفاده می شود.
515513
@@ -542,18 +540,18 @@ From <input id="from" disabled> – To <input id="to" disabled>
542540
```
543541
544542
لطفا توجه داشته باشید:
545-
546-
547543
- وقتی چیزی انتخاب می‌شود، `onselect` فعال می‌شود، اما وقتی انتخاب حذف می‌شود نه.
548544
- طبق [spec](https://w3c.github.io/selection-api/#dfn-selectionchange)، رویداد `document.onselectionchange` نباید برای انتخاب‌های داخل یک کنترل فرم فعال شود، زیرا به مرتبط نیست انتخاب `document` و محدوده برخی از مرورگرها آن را تولید می کنند، اما ما نباید به آن تکیه کنیم.
549-
### Example: moving cursor
550545
546+
547+
### Example: moving cursor
551548
552549
می‌توانیم `selectionStart` و `selectionEnd` را تغییر دهیم که انتخاب را تنظیم می‌کند.
553550
554551
یک مورد مهم لبه زمانی است که `selectionStart` و `selectionEnd` با هم برابر باشند. سپس دقیقاً موقعیت مکان نما است. یا، برای بازنویسی، وقتی چیزی انتخاب نشده است، انتخاب در موقعیت مکان نما جمع می شود.
555552
556553
بنابراین، با تنظیم `selectionStart` و `selectionEnd` روی یک مقدار، مکان‌نما را حرکت می‌دهیم.
554+
557555
مثلا:
558556
559557
```html run autorun
@@ -575,10 +573,10 @@ Focus on me, the cursor will be at position 10.
575573
576574
### Example: modifying selection
577575
578-
579576
برای تغییر محتوای انتخابی، می‌توانیم از روش `input.setRangeText()` استفاده کنیم. البته، می‌توانیم `selectionStart/End` را بخوانیم و با آگاهی از انتخاب، زیررشته مربوط به `value` را تغییر دهیم، اما `setRangeText` قدرتمندتر و اغلب راحت‌تر است.
580577
581578
این یک روش تا حدودی پیچیده است. در ساده ترین شکل تک آرگومان خود، جایگزین محدوده انتخابی کاربر می شود و انتخاب را حذف می کند.
579+
582580
به عنوان مثال، در اینجا انتخاب کاربر با `*...*` پیچیده می شود:
583581
584582
```html run autorun
@@ -639,7 +637,7 @@ button.onclick = () => {
639637
640638
## Making unselectable
641639
642-
2. برای غیرقابل انتخاب کردن چیزی، سه راه وجود دارد:
640+
برای غیرقابل انتخاب کردن چیزی، سه راه وجود دارد:
643641
644642
1. از ویژگی `user-select: none` استفاده کنید.
645643
@@ -652,13 +650,12 @@ button.onclick = () => {
652650
<div>Selectable <div id="elem">Unselectable</div> Selectable</div>
653651
```
654652
655-
656653
این اجازه نمی‌دهد انتخاب از «elem» شروع شود. اما کاربر ممکن است انتخاب را از جای دیگری شروع کند و `elem` را در آن قرار دهد.
657654
658-
سپس `elem` به بخشی از `document.getSelection()` تبدیل می‌شود، بنابراین انتخاب در واقع اتفاق می‌افتد، اما محتوای آن معمولاً در کپی-پیست نادیده گرفته می‌شود.
655+
سپس `elem` به بخشی از `document.getSelection()` تبدیل می‌شود، بنابراین انتخاب در واقع اتفاق می‌افتد، اما محتوای آن معمولاً در کپی-پیست نادیده گرفته می‌شود.
659656
660657
661-
4. 3. از اقدام پیش‌فرض در رویدادهای `onselectstart` یا `mousedown` جلوگیری کنید.
658+
2. از اقدام پیش‌فرض در رویدادهای `onselectstart` یا `mousedown` جلوگیری کنید.
662659
663660
```html run
664661
<div>Selectable <div id="elem">Unselectable</div> Selectable</div>
@@ -671,8 +668,8 @@ button.onclick = () => {
671668
این کار از شروع انتخاب روی `elem` جلوگیری می‌کند، اما بازدیدکننده ممکن است آن را از عنصر دیگری شروع کند و سپس به `elem` گسترش دهد.
672669
673670
زمانی که کنترل‌کننده رویداد دیگری در همان عملکرد وجود دارد که انتخاب را فعال می‌کند، راحت است (e.g. `mousedown`). بنابراین، برای جلوگیری از تضاد، انتخاب را غیرفعال می‌کنیم و همچنان اجازه می‌دهیم محتوای `elem` کپی شود.
674-
5. همچنین می‌توانیم انتخاب post-factum را بعد از اینکه با `document.getSelection().empty()` رخ داد پاک کنیم. این به ندرت استفاده می شود، زیرا باعث چشمک زدن ناخواسته با ظاهر شدن انتخاب می شود - ناپدید می شود.
675-
671+
672+
3. همچنین می‌توانیم انتخاب post-factum را بعد از اینکه با `document.getSelection().empty()` رخ داد پاک کنیم. این به ندرت استفاده می شود، زیرا باعث چشمک زدن ناخواسته با ظاهر شدن انتخاب می شود - ناپدید می شود.
676673
677674
## References
678675
@@ -683,7 +680,6 @@ button.onclick = () => {
683680
684681
## Summary
685682
686-
687683
ما دو API مختلف را برای انتخاب پوشش دادیم:
688684
689685
1. برای سند: اشیاء `Selection` و `Range`.
@@ -692,6 +688,7 @@ button.onclick = () => {
692688
وAPI دوم بسیار ساده است، زیرا با متن کار می کند.
693689
694690
دستور العمل های مورد استفاده احتمالاً عبارتند از:
691+
695692
1. دریافت انتخاب:
696693
```js
697694
let selection = document.getSelection();
@@ -704,7 +701,7 @@ button.onclick = () => {
704701
cloned.append(selection.getRangeAt(i).cloneContents());
705702
}
706703
```
707-
3. تنظیمات selection:
704+
2. تنظیمات selection:
708705
```js
709706
let selection = document.getSelection();
710707
@@ -715,4 +712,5 @@ button.onclick = () => {
715712
selection.removeAllRanges();
716713
selection.addRange(range);
717714
```
715+
718716
و در نهایت، در مورد مکان نما. موقعیت مکان نما در عناصر قابل ویرایش، مانند `<textarea>` همیشه در ابتدا یا انتهای انتخاب است. می‌توانیم با تنظیم `elem.selectionStart` و `elem.selectionEnd` از آن برای به دست آوردن موقعیت مکان‌نما یا حرکت مکان‌نما استفاده کنیم.

0 commit comments

Comments
 (0)