Skip to content

Commit 0c31d27

Browse files
authored
Update article.md
1 parent bc51bc8 commit 0c31d27

1 file changed

Lines changed: 20 additions & 18 deletions

File tree

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

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ let range = new Range();
2626
پس می‌توانیم مرزهای انتخاب را با استفاده از `range.setStart(node, offset)` و `range.setEnd(node, offset)` تنظیم کنیم.
2727

2828
همانطور که ممکن است حدس بزنید، در ادامه از اشیاء `Range` برای انتخاب استفاده خواهیم کرد، اما ابتدا اجازه دهید تعداد کمی از این اشیاء ایجاد کنیم.
29+
2930
### Selecting the text partially
3031

3132
نکته جالب این است که آرگومان اول `node` در هر دو روش می تواند یک text node یا یelement node عنصر باشد و معنای آرگومان دوم به آن بستگی دارد.
@@ -34,6 +35,7 @@ let range = new Range();
3435
**اگر `node` یک text nodeاست، `offset` باید موقعیتی در متن آن باشد.**
3536

3637
به عنوان مثال، با توجه به عنصر `<p>Hello</p>`، می‌توانیم محدوده حاوی حروف «ll» را به صورت زیر ایجاد کنیم:
38+
3739
```html run
3840
<p id="p">Hello</p>
3941
<script>
@@ -46,6 +48,7 @@ let range = new Range();
4648
</script>
4749
```
4850

51+
4952
در اینجا اولین فرزند `<p>` را می گیریم (این text node است) و موقعیت های متن را در داخل آن مشخص می کنیم:
5053

5154
![](range-hello-1.svg)
@@ -57,11 +60,13 @@ let range = new Range();
5760
این برای ایجاد محدوده هایی که شامل گره ها به عنوان یک کل هستند، مفید است، نه اینکه در جایی در متن خود متوقف شوند.
5861

5962
به عنوان مثال، ما یک قطعه سند پیچیده تر داریم:
63+
6064
```html autorun
6165
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
6266
```
6367

6468
در اینجا ساختار DOM آن با هر دو گره عنصر و متن آمده است:
69+
6570
<div class="select-p-domtree"></div>
6671

6772
<script>
@@ -100,6 +105,7 @@ drawHtmlTree(selectPDomtree, 'div.select-p-domtree', 690, 320);
100105

101106

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

105111

@@ -111,6 +117,7 @@ drawHtmlTree(selectPDomtree, 'div.select-p-domtree', 690, 320);
111117
بنابراین می‌توانیم آن را به‌عنوان `range.setEnd(p, 2)` تنظیم کنیم.
112118

113119
در اینجا نسخه ی نمایشی است. اگر آن را اجرا کنید، می بینید که متن انتخاب شده است:
120+
114121
```html run
115122
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
116123

@@ -131,6 +138,7 @@ drawHtmlTree(selectPDomtree, 'div.select-p-domtree', 690, 320);
131138
```
132139

133140
در اینجا یک پایه تست انعطاف‌پذیرتر وجود دارد که در آن می‌توانید اعداد شروع/پایان محدوده را تنظیم کنید و انواع دیگر را بررسی کنیدد:
141+
134142
```html run autorun
135143
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
136144

@@ -153,8 +161,8 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
153161
```
154162

155163
به عنوان مثال، انتخاب در همان `<p>` از آفست `1` تا `4`، محدوده `<i>italic</i> and <b>bold</b>` را به ما می‌دهد:
156-
![](range-example-p-1-3.svg)
157164

165+
![](range-example-p-1-3.svg)
158166

159167
```smart header="گره های شروع و پایان می توانند متفاوت باشند"
160168
ما مجبور نیستیم از همان گره در «setStart» و «setEnd» استفاده کنیم. یک محدوده ممکن است در بسیاری از گره‌های غیرمرتبط باشد. فقط مهم است که پایان آن پس از شروع در سند باشد.
@@ -163,11 +171,13 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
163171
### Selecting a bigger fragment
164172

165173
بیایید در مثال خود یک انتخاب بزرگتر انجام دهیم، مانند این:
174+
166175
![](range-example-p-2-b-3.svg)
167176

168177
ما قبلاً می دانیم که چگونه این کار را انجام دهیم. فقط باید شروع و پایان را به عنوان یک افست نسبی در گره های متنی تنظیم کنیم.
169178

170179
ما باید یک محدوده ایجاد کنیم، که:
180+
171181
- از موقعیت 2 در `<p>` فرزند اول شروع می‌شود (با گرفتن همه حرف‌های اول «مثال<b>ample:</b>» به جز دو حرف اول)
172182
- در `<b>`فرزند اول به موقعیت 3 ختم می شود (با گرفتن سه حرف اول "<b>bol</b>d"، اما نه بیشتر):
173183
```html run
@@ -191,11 +201,11 @@ From <input id="start" type="number" value=1> – To <input id="end" type="numbe
191201
اگر می‌خواهیم گره‌ها را به‌عنوان یک کل بگیریم، می‌توانیم عناصر را در `setStart/setEnd` ارسال کنیم. در غیر این صورت می توانیم در سطح متن کار کنیم.
192202

193203
## Range properties
204+
194205
شی range که در مثال بالا ایجاد کردیم دارای ویژگی های زیر است:
195206

196207
![](range-example-p-2-b-3-range.svg)
197208

198-
199209
- `startContainer`، `startOffset` - گره و افست شروع،
200210
- در مثال بالا: اولین گره متن داخل `<p>` و `2`.
201211
- `endContainer`، `endOffset` - گره و افست انتهایی،
@@ -314,6 +324,8 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
314324

315325
انتخاب سند با شی `Selection` نشان داده می شود که می تواند به عنوان `window.getSelection()` یا `document.getSelection()` به دست آید. یک انتخاب ممکن است شامل محدوده صفر یا بیشتر باشد. حداقل،specification](https://www.w3.org/TR/selection-api/) این را می گوید. اگرچه در عمل، فقط فایرفاکس اجازه می دهد تا با استفاده از `key:Ctrl+click` (`key:Cmd+click` برای Mac)، چندین محدوده را در سند انتخاب کنید.
316326

327+
در اینجا یک اسکرین شات از یک انتخاب با 3 محدوده، ساخته شده در فایرفاکس آمده است:
328+
317329
![](selection-firefox.svg)
318330

319331
سایر مرورگرها حداکثر 1 محدوده را پشتیبانی می کنند. همانطور که خواهیم دید، برخی از روش های `Selection` نشان می دهد که ممکن است محدوده های زیادی وجود داشته باشد، اما باز هم، در همه مرورگرها به جز فایرفاکس، حداکثر 1 وجود دارد.
@@ -326,7 +338,6 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
326338

327339

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

332343
همچنین، ویژگی هایی وجود دارد که اغلب راحتی بهتری را ارائه می دهند.
@@ -354,7 +365,6 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
354365
انتخاب چیزی با ماوس را می توان در هر دو جهت انجام داد: "left-to-right" یا "right-to-left".
355366
356367
به عبارت دیگر، وقتی دکمه ماوس را فشار داده و سپس در سند به جلو حرکت می کند، انتهای آن (focus) بعد از شروع آن (anchor) خواهد بود.
357-
358368
به عنوان مثال. اگر کاربر شروع به انتخاب با ماوس کند و از "مثال" به "مورب" برود:
359369
360370
![](selection-direction-forward.svg)
@@ -367,6 +377,7 @@ Click buttons to run methods on the selection, "resetExample" to reset it.
367377
## Selection events
368378

369379
رویدادهایی برای پیگیری انتخاب وجود دارد:
380+
370381
- `elem.onselectstart` -- زمانی که یک انتخاب *شروع می شود* به طور خاص روی عنصر `elem` (یا داخل آن). به عنوان مثال، زمانی که کاربر دکمه ماوس را روی آن فشار می دهد و شروع به حرکت اشاره گر می کند.
371382
- جلوگیری از عمل پیش فرض شروع انتخاب را لغو می کند. بنابراین شروع انتخاب از این عنصر غیرممکن می شود، اما عنصر همچنان قابل انتخاب است. بازدیدکننده فقط باید انتخاب را از جای دیگری شروع کند.
372383
- `document.onselectionchange` - هر زمان که یک انتخاب تغییر کند یا شروع شود.
@@ -397,7 +408,6 @@ From <input id="from" disabled> – To <input id="to" disabled>
397408
398409
دو روش برای کپی کردن محتوای انتخابی وجود دارد:
399410
400-
401411
1. می‌توانیم از `document.getSelection().toString()` برای دریافت آن به عنوان متن استفاده کنیم.
402412
2. در غیر این صورت، برای کپی کردن DOM کامل، به عنوان مثال. اگر نیاز به قالب‌بندی داشته باشیم، می‌توانیم محدوده‌های زیربنایی را با `getRangeAt(...)` دریافت کنیم. یک شی `Range` به نوبه خود دارای متد `cloneContents()` است که محتوای آن را شبیه‌سازی می‌کند و به عنوان شی `DocumentFragment` برمی‌گرداند، که می‌توانیم آن را در جای دیگری درج کنیم.
403413
3.
@@ -431,8 +441,6 @@ As text: <span id="astext"></span>
431441
## Selection methods
432442
433443
ا می توانیم با افزودن/حذف محدوده ها با انتخاب کار کنیم:
434-
435-
436444
- `getRangeAt(i)` -- محدوده i-ام را دریافت کنید که از `0` شروع می شود. در همه مرورگرها به جز فایرفاکس، فقط `0` استفاده می شود.
437445
- `addRange(range)` -- `range` را به انتخاب اضافه کنید. همه مرورگرها به جز فایرفاکس تماس را نادیده می گیرند، در صورتی که انتخاب از قبل دارای یک محدوده مرتبط باشد.
438446
- `removeRange(range)` -- `range` را از انتخاب حذف کنید.
@@ -454,7 +462,6 @@ As text: <span id="astext"></span>
454462
455463
456464
برای اکثر وظایف، این روش‌ها خوب هستند، نیازی به دسترسی به شی `Range` زیرین نیست.
457-
458465
به عنوان مثال، انتخاب کل محتوای پاراگراف `<p>`:
459466
460467
```html run
@@ -467,6 +474,7 @@ As text: <span id="astext"></span>
467474
```
468475
469476
همین مورد با استفاده از محدوده ها:
477+
470478
```html run
471479
<p id="p">Select me: <i>italic</i> and <b>bold</b></p>
472480
@@ -493,6 +501,7 @@ The exception is some selection methods, that replace the existing selection, su
493501
- `input.selectionStart` -- موقعیت شروع انتخاب (قابل نوشتن)،
494502
- `input.selectionEnd` -- موقعیت انتهای انتخاب (قابل نوشتن)،
495503
- `input.selectionDirection` -- جهت انتخاب، یکی از: "backward"، "backward" یا "none" (به عنوان مثال اگر با دوبار کلیک ماوس انتخاب شده باشد)،
504+
496505
497506
(رویداد ها)Events:
498507
- `input.onselect` -- هنگامی که چیزی انتخاب می شود فعال می شود.
@@ -507,12 +516,6 @@ The exception is some selection methods, that replace the existing selection, su
507516
508517
آخرین آرگومان، `selectionMode`، نحوه تنظیم انتخاب پس از جایگزینی متن را تعیین می‌کند. مقادیر ممکن عبارتند از:
509518
510-
- `"select"` -- the newly inserted text will be selected.
511-
- `"start"` -- the selection range collapses just before the inserted text (the cursor will be immediately before it).
512-
- `"end"` -- the selection range collapses just after the inserted text (the cursor will be right after it).
513-
- `"preserve"` -- attempts to preserve the selection. This is the default.
514-
515-
Now let's see these methods in action.
516519
- `"select"` -- متن درج شده جدید انتخاب خواهد شد.
517520
- `"start"`-- محدوده انتخاب درست قبل از متن درج شده جمع می شود (مکان نما بلافاصله قبل از آن خواهد بود).
518521
- `"end"` -- محدوده انتخاب درست بعد از متن درج شده جمع می شود (مکان نما درست بعد از آن خواهد بود).
@@ -540,6 +543,8 @@ From <input id="from" disabled> – To <input id="to" disabled>
540543
```
541544
542545
لطفا توجه داشته باشید:
546+
547+
543548
- وقتی چیزی انتخاب می‌شود، `onselect` فعال می‌شود، اما وقتی انتخاب حذف می‌شود نه.
544549
- طبق [spec](https://w3c.github.io/selection-api/#dfn-selectionchange)، رویداد `document.onselectionchange` نباید برای انتخاب‌های داخل یک کنترل فرم فعال شود، زیرا به مرتبط نیست انتخاب `document` و محدوده برخی از مرورگرها آن را تولید می کنند، اما ما نباید به آن تکیه کنیم.
545550
### Example: moving cursor
@@ -576,7 +581,6 @@ Focus on me, the cursor will be at position 10.
576581
برای تغییر محتوای انتخابی، می‌توانیم از روش `input.setRangeText()` استفاده کنیم. البته، می‌توانیم `selectionStart/End` را بخوانیم و با آگاهی از انتخاب، زیررشته مربوط به `value` را تغییر دهیم، اما `setRangeText` قدرتمندتر و اغلب راحت‌تر است.
577582
578583
این یک روش تا حدودی پیچیده است. در ساده ترین شکل تک آرگومان خود، جایگزین محدوده انتخابی کاربر می شود و انتخاب را حذف می کند.
579-
580584
به عنوان مثال، در اینجا انتخاب کاربر با `*...*` پیچیده می شود:
581585
582586
```html run autorun
@@ -669,7 +673,6 @@ button.onclick = () => {
669673
این کار از شروع انتخاب روی `elem` جلوگیری می‌کند، اما بازدیدکننده ممکن است آن را از عنصر دیگری شروع کند و سپس به `elem` گسترش دهد.
670674
671675
زمانی که کنترل‌کننده رویداد دیگری در همان عملکرد وجود دارد که انتخاب را فعال می‌کند، راحت است (e.g. `mousedown`). بنابراین، برای جلوگیری از تضاد، انتخاب را غیرفعال می‌کنیم و همچنان اجازه می‌دهیم محتوای `elem` کپی شود.
672-
673676
5. همچنین می‌توانیم انتخاب post-factum را بعد از اینکه با `document.getSelection().empty()` رخ داد پاک کنیم. این به ندرت استفاده می شود، زیرا باعث چشمک زدن ناخواسته با ظاهر شدن انتخاب می شود - ناپدید می شود.
674677
675678
@@ -715,5 +718,4 @@ button.onclick = () => {
715718
selection.removeAllRanges();
716719
selection.addRange(range);
717720
```
718-
719-
و در نهایت، در مورد مکان نما. موقعیت مکان نما در عناصر قابل ویرایش، مانند `<textarea>` همیشه در ابتدا یا انتهای انتخاب است. می‌توانیم با تنظیم `elem.selectionStart` و `elem.selectionEnd` از آن برای به دست آوردن موقعیت مکان‌نما یا حرکت مکان‌نما استفاده کنیم.
721+
و در نهایت، در مورد مکان نما. موقعیت مکان نما در عناصر قابل ویرایش، مانند `<textarea>` همیشه در ابتدا یا انتهای انتخاب است. می‌توانیم با تنظیم `elem.selectionStart` و `elem.selectionEnd` از آن برای به دست آوردن موقعیت مکان‌نما یا حرکت مکان‌نما استفاده کنیم.

0 commit comments

Comments
 (0)