اینترنت پنجره ها اندروید

تکنسین هایی که با DOM کار می کنند: والدین، کودک و عناصر مجاور. دستکاری با DOM در جاوا اسکریپت خالص بررسی وجود شرکت های تابعه

به عنوان یک قانون، زمانی که شما نیاز به انجام هر گونه اقدام با DOM، توسعه دهندگان از jQuery استفاده می کنند. با این حال، تقریبا هر دستکاری DOM را می توان در جاوا اسکریپت خالص با استفاده از API DOM خود انجام داد.

این API را بیشتر در نظر بگیرید:

در نهایت شما کتابخانه ساده DOM خود را بنویسید، که می تواند در هر پروژه مورد استفاده قرار گیرد.

درخواست های DOM

درخواست های DOM با استفاده از روش .queryselector () انجام می شود، که به عنوان یک استدلال یک انتخاب کننده CSS دلخواه دریافت می شود.

const myelement \u003d document.queryselector ("# foo\u003e div.bar")

او اولین عنصر مناسب را باز خواهد کرد. برعکس، ممکن است بررسی کنید که آیا عنصر انتخاب کننده مربوط به:

myelement.matches ("div.bar") \u003d\u003d\u003d درست است

اگر شما نیاز به تمام اقلام مربوط به انتخاب را دریافت کنید، از طراحی زیر استفاده کنید:

const myelements \u003d document.queryselectorall ("نوار")

اگر می دانید که چگونه به عنصر والدین مراجعه کنید، می توانید به راحتی در میان عناصر کودک خود جستجو کنید، به جای جستجوی در سراسر کد:

const mychildelemet \u003d myelement.queryselector ("ورودی") // به جای: // document.queryselector ("# foo\u003e div.bar inport")

سوال مطرح می شود: چرا پس از آن از روش های دیگر، کمتر راحت استفاده کنید مانند .gelementsbytagname ()؟ یک مشکل کوچک وجود دارد - نتیجه خروجی .Queryselector () به روز نمی شود، و هنگامی که یک عنصر جدید اضافه می کنیم (نگاه کنید)، آن را تغییر نخواهد داد.

const lestenes1 \u003d document.queryselectorall ("div") const lements2 \u003d document.getelemsybytagname ("div") const newelement \u003d document.createelement ("div" document.bodyeelement ("div") document.body.appendchild (newelement) عناصر 1. طول \u003d\u003d\u003d عناصر 2.length // false

همچنین QuerySelectorall () همه چیز را در یک لیست جمع آوری می کند، که باعث می شود بسیار موثر نیست.

چگونه با لیست کار کنیم؟

علاوه بر همه u.queryselectorall () دو تن از تفاوت های کوچک وجود دارد. شما نمی توانید به سادگی با روش های نتایج به نتایج تماس بگیرید و انتظار داشته باشید که آنها به هر یک از آنها اعمال شوند (همانطور که می توانید آن را با جی کوئری انجام دهید). در هر صورت، لازم است تمام عناصر در چرخه را مرتب کنید. دوم - جسم بازگشتی یک لیست از عناصر، نه یک آرایه است. در نتیجه، روش های آرایه ها کار نخواهد کرد. البته، روش هایی برای لیست ها وجود دارد، چیزی شبیه به .oreach ()، اما، افسوس، آنها برای همه موارد مناسب نیستند. بنابراین بهتر است یک لیست را به یک آرایه تبدیل کنید:

// با استفاده از array.from () array.from (myelements) .foreach // zoreach // array نمونه اولیه (تا ES6) Array.Prototype.foreach.call (myelements، dosomethingeacheachelement) // easy: .foreach.call (myelements، dosomething@element )

هر عنصر دارای برخی از خواص است که به "خانواده" اشاره دارد.

myelement.children myelement.firstelmentchild myeelement.lastelementchild myeelement.previouletsiBlings myeLement.NextElementsIblingbling

از آنجا که رابط عنصر (عنصر) از رابط گره (گره) به ارث برده می شود، خواص زیر نیز وجود دارد:

myelement.childnodes myeelement.firstchild myeelement.lastchild myelement.Previousssiblings myelement.nextsibling myelement.Parennode myeLement.ParentElement

اولین خواص به مورد اشاره می شود، و آخرین (به استثنای .Parenelement) می تواند لیست عناصر هر نوع باشد. بر این اساس، شما می توانید نوع مورد را بررسی کنید:

myelement.firstchild.nodetype \u003d\u003d\u003d 3 // این مورد یک گره متن خواهد بود

اضافه کردن کلاس ها و ویژگی ها

اضافه کردن یک کلاس جدید بسیار ساده است:

myElement.ClassList.add ("foo") myeLement.ClassList.Remove ("نوار") myElement.ClassList.Toggle ("BAZ")

اضافه کردن یک ملک برای یک مورد فقط به عنوان هر شیء رخ می دهد:

// به دست آوردن ارزش attribute const value \u003d myelement.Value // ویژگی را به عنوان ویژگی myelement.value \u003d "عنصر) تنظیم کنید (! lang: foo" // Для установки нескольких свойств используйте.Object.assign() Object.assign(myElement, { value: "foo", id: "bar" }) // Удаление атрибута myElement.value = null !}

شما می توانید از روش ها استفاده کنید. [)، .etattribute () i.removeattribute (). آنها بلافاصله ویژگی های HTML از عنصر را تغییر می دهند (در مقایسه با خواص DOM)، که باعث بازپرداخت مرورگر می شود (شما می توانید تمام تغییرات را با مطالعه عنصر با استفاده از ابزارهای توسعه دهنده در مرورگر مشاهده کنید). چنین مترورها نه تنها نیاز به منابع بیشتری نسبت به نصب خواص DOM دارند، بلکه می توانند به اشتباهات غیر منتظره منجر شوند.

به عنوان یک قاعده، آنها برای عناصری استفاده می شود که دارای خواص DOM مربوطه مانند Colspan نیستند. یا اگر استفاده از آنها واقعا ضروری باشد، به عنوان مثال، برای وراثت خواص HTML (نگاه کنید به).

اضافه کردن CSS-styles

آنها را به همان شیوه به عنوان خواص دیگر اضافه کنید:

myelement.style.marginleft \u003d "2em"

برخی از خواص خاص را می توان با استفاده از .style تنظیم کرد، اما اگر می خواهید پس از برخی از محاسبات ارزش دریافت کنید، بهتر است از window.getComptystyle استفاده کنید. این روش یک مورد را دریافت می کند و CSSSTYLEDECLARATION را باز می گرداند، حاوی سبک ها هر دو عنصر و والدین آن است:

Window.GETCOMPUTOMSTYLE (MYELEMENT) .GETPROPERTYVALUE ("حاشیه سمت چپ")

تغییر بخش

شما می توانید موارد را حرکت دهید:

// اضافه کردن element1 به عنوان آخرین عنصر Element2 Element1.appendchild (element2) // insert lement2 به عنوان عنصر عنصر کودک 1 در مقابل عنصر 1 lement1.insertbefore (element2، element3)

اگر شما نمی خواهید حرکت کنید، اما شما باید یک کپی را وارد کنید، ما از آن استفاده می کنیم:

// ایجاد یک clone const const myelementclone \u003d myelement.clonenode () myparenelement.appendchild (myelementclone)

روش. clonenode () ارزش بولین را به عنوان یک استدلال می گیرد و عناصر کودک نیز کلون شده اند.

البته، شما می توانید موارد جدید را ایجاد کنید:

const mynewelement \u003d document.createelement ("div") const mynewtextnode \u003d document.createtextnode ("برخی از متن")

و سپس آنها را همانطور که در بالا نشان داده شده وارد کنید. این به طور مستقیم به حذف کار نمی کند، اما شما می توانید آن را از طریق عنصر پدر و مادر انجام دهید:

myparenelement.removechild (myelement)

شما می توانید تماس بگیرید و غیر مستقیم:

myelement.parentnode.removechild (myelement)

روش های عناصر

هر عنصر دارای خواص مانند .innerhtml i.TextContent، آنها حاوی کد HTML هستند و به همین ترتیب، متن خود را دارد. مثال زیر محتویات عنصر را تغییر می دهد:

// تغییر HTML myelement.innerhtml \u003d `

محتوای جدید

boop Boop Boop Boop

`// بنابراین، محتویات توسط myelement.innerhtml \u003d null // اضافه شده به HTML myelement.innerhtml + \u003d \u003d ادامه خواندن ...

در واقع، تغییر در HTML یک ایده بد است، زیرا تمام تغییراتی که قبلا ساخته شده اند از دست رفته اند و دستگیره های رویداد بیش از حد است. بهتر است از این روش استفاده کنید فقط به طور کامل تمام HTML را رها کنید و آن را با یک کپی از سرور جایگزین کنید. مثل این:

const link \u003d document.createelement ("a") const text \u003d document.createtextnode ("ادامه خواندن ...") const hr \u003d document.createelement ("hr") link.href \u003d "foo.html" link.appendchild ( متن) myelement.appendchild (لینک) myelement.appendchild (hr)

با این حال، این دو Redrawrs در مرورگر را شامل می شود، در حالی که .innerhtml تنها به یکی منجر خواهد شد. شما می توانید آن را دور نگه دارید، اگر ابتدا همه چیز را به documentfragment اضافه کنید، و سپس یک قطعه را که نیاز دارید اضافه کنید:

Fragment Const \u003d document.createdocumentfragment () fragment.appendchild (متن) fragment.appendchild (hr) myelement.appendchild (قطعه)

دستگیره های رویداد

یکی از ساده ترین دست ها:

myelement.onclick \u003d function onclick (رویداد) (console.log (event.type + "اخراج شد")

اما، به عنوان یک قاعده، باید اجتناب شود. در اینجا.OnClick یک ویژگی عنصر است، و در تئوری شما می توانید آن را تغییر دهید، اما شما قادر به اضافه کردن سایر دستگیره ها با استفاده از ویژگی دیگری که به یکی از قدیمی ها اشاره دارد اضافه کنید.

برای اضافه کردن دستگیره بهتر است از آن استفاده کنید. addeventlistener (). این سه استدلال طول می کشد: نوع رویداد، تابع که هر زمان که هر زمان که باعث می شود، و شیء پیکربندی نامیده می شود (بعدا به آن بازگردانده می شود).

myelement.addeventlistener ("کلیک"، تابع (console.log))) myelement.addeventlistener ("کلیک"، تابع (رویداد) (console.log (event.type + "دوباره اخراج شد"))

رویداد event.target به عنصر اضافه می شود که رویداد ثابت شده است.

و بنابراین شما می توانید به تمام خواص دسترسی داشته باشید:

// `forms` forms` - آرایه حاوی پیوندها به همه فرم ها const myform \u003d document.forms const myinputelements \u003d myform.queryselectorlall (" ورودی ") array.from (myinputelements) .foreach (el \u003d\u003e (el.addeventlistener (" el.addeventlistener) ، تابع (رویداد) (console.log (event.target.value)))))))

پیش فرض پیش فرض

برای انجام این کار، از Method.PreventDefault () استفاده کنید، که اقدامات استاندارد را مسدود می کند. به عنوان مثال، اگر مجوز در طرف مشتری موفق نبود، ارسال فرم را متوقف کند:

myform.addeventlistener ("ارسال"، تابع (const name \u003d this squeryserector ("# نام") اگر (name.value \u003d\u003d\u003d "(! lang: دونالد اردک") { alert("You gotta be kidding!") event.preventDefault() } }) !}

Method.Stoppropagation () کمک خواهد کرد اگر شما یک دستاورد رویداد خاص، ثابت در پشت عنصر کودک، و دوم دست دوم از همان رویداد اختصاص داده شده به والدین.

همانطور که قبلا ذکر شد، روش .addeventlistener () سومین استدلال اختیاری را به عنوان یک شیء با پیکربندی می گیرد. این شی باید شامل هر یک از خواص بولین زیر باشد (به طور پیش فرض همه در ارزش نادرست):

  • ضبط: رویداد قبل از هر مورد دیگری در DOM به این عنصر متصل می شود.
  • یک بار: این رویداد تنها می تواند یک بار ثابت شود؛
  • passive: Event.PreventDefault () نادیده گرفته خواهد شد (استثنا در هنگام خطا).

شایع ترین اموال .capture، و بسیار شایع است که یک روش کوتاه برای ضبط وجود دارد: به جای عبور آن در شیء پیکربندی، به سادگی مقدار آن را در اینجا مشخص کنید:

myelement.addeventlistener (نوع، شنونده، درست)

پردازنده ها با استفاده از روش M.RemoveeventListener () میزبانی دو استدلال حذف می شوند: نوع رویداد و مرجع به حذف دستیار. به عنوان مثال، اموال ONC را می توان به صورت زیر اجرا کرد:

myelement.addeventlistener ("تغییر"، عملکرد شنونده (رویداد) (CONSOLE.LOG (EVENT.TYPE + "به دست آورد" + این) this.removeeventlistener ("تغییر"، شنونده)))

وراثت

فرض کنید شما یک آیتم دارید و می خواهید برای تمام عناصر فرزند خود، دستیار رویداد را اضافه کنید. سپس شما باید آنها را در چرخه با استفاده از روش myform.queryselectorlall ("ورودی") رانندگی کنید، همانطور که در بالا نشان داده شده است. با این حال، شما می توانید به سادگی موارد را به شکل اضافه کنید و محتوای خود را با استفاده از event.target بررسی کنید.

myform.addeventlistener ("تغییر"، تابع (رویداد) (const target \u003d event.target اگر (target.mats ("ورودی")) (console.log (target.value))))

و یکی دیگر از این روش این است که دستگیره به طور خودکار به عناصر کودک جدید گره خورده است.

انیمیشن

ساده ترین راه برای اضافه کردن انیمیشن با استفاده از CSS با اموال انتقال. اما برای انعطاف پذیری بیشتر (به عنوان مثال، جاوا اسکریپت مناسب است.

با استفاده از روش window.settimeout () تا زمانی که انیمیشن تمام شود، بهترین ایده نیست، زیرا درخواست شما ممکن است آویزان شود، به ویژه در دستگاه های تلفن همراه. بهتر است از Window.RequestanimationFrame () برای صرفه جویی در تمام تغییرات به بازپرداخت بعدی استفاده کنید. این یک تابع به عنوان یک استدلال طول می کشد، که به نوبه خود یک تمبر زمان را دریافت می کند:

const const \u003d window.performance.now () const dury \u003d 2000 window.requestanimationFrame (Const Progress \u003d در حال حاضر - شروع myelement.style.opacity \u003d پیشرفت / مدت اگر (پیشرفت< duration) { window.requestAnimationFrame(fadeIn) } }

به این ترتیب، یک انیمیشن بسیار صاف به دست می آید. در مقاله خود، مارک براون مذاکرات در مورد این موضوع.

ما کتابخانه خود را بنویسیم

این واقعیت که در DOM برای انجام هر گونه عملیات با عناصر باید مرتب شود، ممکن است به نظر می رسد بسیار خسته کننده نسبت به syntax jQuery $ (". foo"). CSS ((رنگ: "قرمز")) . اما چرا چند روش خود را نوشتم، تسهیل این کار؟

Const $ \u003d عملکرد $ (Const Elements \u003d Array.From (Select.QuerySelectorLall (Selector) Return (ElementS، HTML (NewTML) (Element \u003d\u003e Element.innerhtml \u003d newhtml))، CSS (Element \u003d\u003e Object.assign (Element.Style، Newcss))) این را بازگردانید)، در (رویداد، دستیار، گزینه ها) (این leements.poreach (Element \u003d\u003e (Element.AddeventListener (رویداد، دستیار، گزینه ها))) این را بازگردانید))

برنامه های پیچیده و سنگین وب امروز به طور معمول تبدیل شده اند. Crossbox و آسان برای استفاده از کتابخانه های نوع جی کوئری با قابلیت های گسترده آنها می تواند به شدت کمک به دستکاری DOM در پرواز. بنابراین، تعجب آور نیست که بسیاری از توسعه دهندگان از این کتابخانه ها استفاده می کنند که اغلب از آنها با API DOM بومی کار می کنند، که مشکلات زیادی وجود دارد. و اگرچه تمایز در مرورگرها همچنان یک مشکل باقی می ماند، DOM در حال حاضر در شکل بهتر از 5-6 سال پیش، زمانی که جی کوئری محبوبیت را به دست آورد.

در این مقاله، من امکانات DOM را بر روی دستکاری HTML نشان خواهم داد، تمرکز بر رابطه والدین، کودک و عناصر همسایه. در نتیجه، من داده ها را در مورد حمایت از این فرصت ها در مرورگرها ارائه خواهم کرد، اما در نظر داشتم که کتابخانه نوع جی کوئری هنوز به دلیل دسترسی به اشکالات و ناسازگاری ها در اجرای عملکرد بومی، گزینه خوبی باقی مانده است.

شمارش شرکت های تابعه

برای نشان دادن، من از نشانه گذاری بعدی HTML استفاده خواهم کرد، در طول مقاله ما آن را چندین بار تغییر خواهیم داد:

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

var mylist \u003d document.getElementbyid ("MyList")؛ console.log (mylist.children.length)؛ // 6 console.log (mylist.childelementcount)؛ // 6

همانطور که می بینید، نتایج یکسان هستند، هرچند تکنیک ها متفاوت هستند. در اولین مورد، من از ویژگی های کودکان استفاده می کنم. این ویژگی فقط خواندنی است، مجموعه ای از عناصر HTML را در داخل عنصر درخواست شده باز می گرداند؛ برای شمارش تعداد آنها، من از ویژگی های طول این مجموعه استفاده می کنم.

در مثال دوم، از روش ChildelementCount استفاده می کنم، که به نظر من دقیق تر و به طور بالقوه بیشتر پشتیبانی می شود (ما بعدا بحث خواهیم کرد، من فکر نمی کنم که شما با درک آنچه که او می کند، مشکلی داشته باشید).

من می توانم سعی کنم از childnodes.length استفاده کنم (به جای کودکان)، اما در نتیجه نگاه کنید:

var myList \u003d document.getElementbyid ("MyList")؛ console.log (mylist.childnodes.length)؛ // 13

این 13 را باز می گرداند، زیرا ChildNodes مجموعه ای از تمام گره ها است، از جمله فضاهای - این را در نظر بگیرید اگر شما مهم تر از تفاوت بین شرکت های تابعه و عناصر کودک هستید.

وجود شرکت های تابعه را بررسی کنید

برای بررسی حضور عنصر شرکت تابعه، می توانم از روش Haschildnodes () استفاده کنم. این روش یک مقدار منطقی را به دست می دهد، گزارشگری در مورد دسترسی یا غیبت آنها:

var myList \u003d document.getElementbyid ("MyList")؛ console.log (mylist.haschildnodes ())؛ // درست است، واقعی.

من می دانم که در لیست من شرکت های تابعه وجود دارد، اما من می توانم HTML را تغییر دهم تا آنها نباشند؛ در حال حاضر نشانه گذاری به نظر می رسد این است:

و در اینجا نتیجه راه اندازی جدید Haschildnodes ():

console.log (mylist.haschildnodes ())؛ // درست است، واقعی.

این روش همچنان درست است. اگر چه لیست شامل هیچ آیتم نیست، فضای خاصی وجود دارد که نوع معتبر گره است. این روش تمام گره ها را در نظر می گیرد، نه تنها عناصر گره. برای ایجاد haschildnodes () بازگشت نادرست، ما باید دوباره علامت گذاری را تغییر دهیم:

و اکنون نتیجه مورد انتظار در کنسول نمایش داده می شود:

console.log (mylist.haschildnodes ())؛ // false

البته، اگر می دانم که می توانم یک فضا را ببینم، ابتدا من وجود گره های کودک را بررسی خواهم کرد، سپس با استفاده از اموال Nodetype، من تعریف می کنم که عناصر عناصر در میان آنها وجود دارد.

اضافه کردن و حذف شرکت های تابعه

تکنیک هایی وجود دارد که می تواند برای اضافه کردن و حذف عناصر از DOM استفاده شود. معروف ترین آنها بر اساس ترکیبی از روش های CreateElement () و Appendchild () است.

var myel \u003d document.createelement ("div")؛ Document.AppendChild (Myel)؛

در این مورد، من ایجاد می کنم

با استفاده از روش createeelement () و سپس آن را به بدن اضافه کنید. بسیار ساده و شما احتمالا از این تکنیک قبل استفاده کردید.

اما به جای قرار دادن یک عنصر خاص ایجاد شده، می توانم Appendchild () را نیز استفاده کنم و به سادگی عنصر موجود را حرکت دهید. فرض کنید ما علامت گذاری زیر را داریم:

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

متن مثال

من می توانم محل لیست را با استفاده از کد زیر تغییر دهم:

var mylist \u003d document.getElementbyid ("myList")، container \u003d document.getElementbyid ("c")؛ Container.appendchild (MyList)؛

DOM نهایی به نظر می رسد:

متن مثال

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

لطفا توجه داشته باشید که کل لیست از محل شما (پاراگراف بالا) حذف شده است و سپس پس از آن در مقابل بدن بسته بندی قرار گرفته است. و اگر چه معمولا روش Appendchild () برای اضافه کردن آیتم های ایجاد شده با استفاده از CreateElement () استفاده می شود، همچنین می تواند مورد استفاده قرار گیرد برای انتقال اقلام موجود.

من همچنین می توانم عنصر کودک را از DOM با استفاده از removechild () حذف کنم. این است که چگونه لیست ما از مثال قبلی حذف می شود:

var mylist \u003d document.getElementbyid ("myList")، container \u003d document.getElementbyid ("c")؛ container.removechild (MyList)؛

در حال حاضر عنصر حذف شده است. روش removechild () یک مورد از راه دور را باز می کند و می توانم آن را ذخیره کنم در صورتی که بعدا به آن نیاز داشته باشم.

var myoldchild \u003d document.removechild (myList)؛ Document.body.appendchild (Myoldchild)؛

این روش childnode.remove ()، نسبتا اخیرا به مشخصات اضافه شده است:

var myList \u003d document.getElementbyid ("MyList")؛ myList.Remove ()؛

این روش یک شی از راه دور را باز نمی کند و در IE کار نمی کند (فقط لبه). و هر دو روش گره های متن را به همان شیوه به عنوان گره های گره حذف می کنند.

جایگزینی شرکت های تابعه

من می توانم عنصر کودک موجود را جایگزین کنم، صرفنظر از اینکه آیا این عنصر جدید وجود دارد یا من آن را از ابتدا ایجاد کردم. در اینجا نشانه گذاری است:

متن مثال

var mypar \u003d document.getElementbyid ("par")، mydiv \u003d document.createelement ("div")؛ mydiv.classname \u003d "مثال"؛ mydiv.createtextnode ("عنصر جدید عنصر"))؛ document.replacechild (mydiv، mypar)؛

متن عنصر جدید

همانطور که می بینید، روش replacechild () دو استدلال را انجام می دهد: یک عنصر جدید و عنصر قدیمی جایگزین آن شده است.

من همچنین می توانم از این روش برای انتقال آیتم موجود استفاده کنم. نگاهی به HTML بعدی:

مثال متن 1

مثال متن 2

مثال متن 3

من می توانم پاراگراف اول پاراگراف را با کد زیر جایگزین کنم:

var mypelemybyid ("par1")، mypar3 \u003d document.getElementbyid ("par3")؛ document.replacechild (mypar1، mypar3)؛

در حال حاضر DOM تولید شده به نظر می رسد این است:

مثال متن 2

مثال متن 1

نمونه برداری از عناصر کودک خاص

راه های مختلفی برای انتخاب یک عنصر خاص وجود دارد. همانطور که قبلا نشان داده شد، می توانم شروع به استفاده از مجموعه ای از کودکان یا خواص ChildNodes کنم. اما نگاهی به گزینه های دیگر انجام دهید:

خواص FirstElmentchild و LastElementchild دقیقا همان چیزی را که از آنها انتظار می رود، دقیقا همان چیزی را که از آنها انتظار می رود را انتخاب کنید: عناصر اول و آخرین دختر را انتخاب کنید. بیایید به نشانه گذاری ما بازگردیم:

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

من می توانم عناصر اول و آخر را با این خواص انتخاب کنم:

var myList \u003d document.getElementbyid ("MyList")؛ console.log (mylist.firstelementchild.innerhtml)؛ // "مثال" console.log (mylist.lastelementchild.innerhtml)؛ // "مثال شش"

من همچنین می توانم از خواص PrevioulemsiSlings و NextElementsIbling استفاده کنم، اگر می خواهم عناصر کودک را به غیر از اول یا آخرین انتخاب کنم. این کار با ترکیب خواص FirstElementchild و LastElementchild انجام می شود:

var myList \u003d document.getElementbyid ("MyList")؛ console.log (mylist.firstelementchild.nextElementsIbling.innerhtml)؛ // "مثال دو" console.log (mylist.lastelementchild.previousLementsIbling.innerhtml)؛ // "مثال پنج"

همچنین خواص مشابهی از firstchild، lastchild، prevedsibling، و nextsibling وجود دارد، اما آنها همه نوع گره ها را در نظر می گیرند و نه فقط عناصر. به عنوان یک قاعده، خواص که تنها در نظر گرفته می شود، عناصر گره مفید تر از کسانی هستند که تمام گره ها را انتخاب می کنند.

محتوای را در DOM قرار دهید

من قبلا راه هایی را برای قرار دادن عناصر در DOM در نظر گرفتم. بیایید به یک موضوع مشابه برویم و به گزینه های جدید در قرار دادن محتوا نگاه کنیم.

اول، یک روش ساده وجود دارد insertborefore ()، آن را تا حد زیادی شبیه به Replacechild ()، طول می کشد دو استدلال و در عین حال با عناصر جدید و با آنهایی که موجود هستند، کار می کند. در اینجا نشانه گذاری است:

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

مثال پاراگراف

توجه به پاراگراف، من قصد دارم ابتدا آن را حذف کنم، و سپس در مقابل لیست قرار دهید، همه چیز خوب است:

var mylist \u003d document.getElementbyid ("myList")، container \u003d document.getElementbyby ("c")، mypar \u003d document.getElementbyid ("par")؛ container.insertbefore (mypar، mylist)؛

در نتیجه HTML، پاراگراف در مقابل لیست قرار خواهد گرفت و این راه دیگری برای انتقال آیتم است.

مثال پاراگراف

  • مثال یکی
  • مثال دو
  • مثال سه
  • مثال چهار
  • مثال پنج
  • مثال شش

مانند replacechild ()، insertbefore () دو استدلال را می گیرد: عنصر اضافه شده است و عنصر در مقابل آن ما می خواهیم آن را وارد کنید.

این روش ساده است. بیایید اکنون یک روش قدرتمندتر را امتحان کنیم: روش insertadjacenthtml ().

پاتوسید

$ ("rightarrove") کلیک کنید (تابع () (راست (راست) (rightarroweparents \u003d this.dom ()؛ // dom ()؛ آیا عملکرد شبه ... باید کل هشدار را نشان دهد)؛

پیام هشدار خواهد بود:

بدن div.lol a.Rightarrow

چگونه می توانم آن را با استفاده از جاوا اسکریپت / jQuery دریافت کنم؟

با استفاده از jQuery، مانند این (به دنبال یک راه حل است که از جی کوئری استفاده نمی کند، به استثنای یک رویداد، چالش های بسیار کمتر از توابع، اگر مهم است):

مثال زمان واقعی:

$ (". rightarrow") کلیک کنید (تابع () (var rightarrowparents \u003d؛ $ (این) .Parents (). addback (). نه ("html"). هر (تابع () (var ence \u003d this.tagname .ToloweCase ()؛ اگر (ender.classname) (ورود + \u003d "." + این.classname.replace (/ / g، ".")؛)؛) rightarrowparents.push (ورود)؛)؛ هشدار (rightarrowparents.join (""))؛ بازگشت نادرست؛))؛

(در نمونه های زندگی، من ویژگی کلاس را به DIV به عنوان LOL چند به روز رسانی کردم تا زمانی که پردازش چندین کلاس را نشان دهید.)

در اینجا یک راه حل برای انطباق دقیق مورد است.

مهم است که این انتخاب را درک کنید ( غیرواقعی)، که نشان می دهد ابزار کروم، منحصر به فرد عنصر در DOM را شناسایی نمی کند. ( به عنوان مثال، لیستی از عناصر متوالی را تشخیص نمی دهد. بدون اطلاعات موقعیت / نمایه سازی)

$ .fn.fullselector \u003d function () (var path \u003d this.parents (). addback ()؛ var quickcss \u003d path.get (). نقشه (عملکرد (مورد) (var self \u003d $ (مورد)، شناسه .id؟ "#" + item.id: ""، clss \u003d item.classlist.length؟ item.classlist.tostring () تقسیم ("") .map (تابع (c) (بازگشت "." + c؛ "+ c؛ )). عضویت (""): ""، نام \u003d item.nodename.tolowecase ()، index \u003d self.siblings (نام) .Length؟ ": nth-child (" + self.index () + 1) + ")": ":": "نام \u003d\u003d\u003d" HTML "|| نام \u003d\u003d\u003d" بدن ") (نام بازگشت؛) نام بازگشت + index + ID + CLSS؛)). پیوستن ("\u003e ") ؛ بازگشت QuickCSS؛)؛

و شما می توانید آن را مانند این استفاده کنید:

console.log ($ ("some-selector"). fullselector ())؛

من یک قطعه از t.j. نقل مکان کردم Crowder برای یک پلاگین کوچک جی کوئری. من از نسخه جی کوئری استفاده کردم، حتی اگر درست باشد، این به طور کامل سربار اضافی است، اما من فقط از آن برای اهداف اشکال زدایی استفاده می کنم، بنابراین من اهمیتی نمی دهم.

استفاده كردن:

پهنای باند
فاصله ساده
پیش

// نتیجه (آرایه): ["body"، "div.sampleclass" $ ("span"). getDompath (false) // نتیجه (رشته): body\u003e div.sampleclass $ ("span"). getdompath ( ) // نتیجه: [بدن »،" div # test "] $ (" pre "). getdompath (false) // نتیجه (رشته): body\u003e div # test $ (" pre "). getdompath ()

var obj \u003d $ ("# نمایش ویرایشگر-دکمه")، مسیر \u003d ""؛ در حالی که (tagname)! \u003d "unbj.attrttr)) (if (Еbj.attr)) (path \u003d". "+ obj.attr (" کلاس "). جایگزین (/ \\ s / g،". ") + مسیر؛) اگر (obj.attr ("ID") (مسیر \u003d "#" + obj.attr ("id") + مسیر؛) path \u003d "" + obj.prop ("tagname"). ToloweCase () + مسیر؛ obj \u003d obj.parent ()؛) console.log (مسیر)؛

سلام این ویژگی به یک خطا مرتبط با عنصر فعلی که در راه نمایش داده نمی شود.

همین حالا چک ش کن

$ j (". wrapper") کلیک کنید (تابع (رویداد) (event.target)؛ var rightarrowparents \u003d؛ $ j (event.target) .parents () نه ("HTML، Body"). هر (عملکرد (عملکرد ) (var entle \u003d this.tagname.tolowce ()؛ اگر (itr.ClassName) (ورود + \u003d "." + this.classname.replace (/ / g، ".")؛)؛ دیگر اگر (این) (ورود + \u003d "#" + this.id؛) ورود \u003d replaceall (ورود "،"، "،"، "،")؛ rightarrowparents.push (ورود)؛)؛ rightarrowparents.reverse ()؛ //ifhevent.target .nodename.tolowceCase () \u003d\u003d "A" || event.target.nodename.toloweCase () \u003d\u003d "H1") (var entle \u003d event.target.nodename.tolowce ()؛ اگر (event.target.className) (entle + \u003d "." + event.target.classname.replace (/ / g، ".")؛)؛)؛ دیگر اگر (event.target.id) (ورود + \u003d "#" + event.target.id؛) rightarrowparents.push (ورود)؛ //)

جایی که $ j \u003d متغیر جی کوئری است

همچنین مشکل را با نام کلاس حل کنید

در اینجا یک تابع جایگزینی است:

تابع escaperegexp (str) (بازگشت str.replace (/ ([. * +؟ ^ \u003d!: $ () | \\ [\\] \\ / \\\\]) / g، "\\\\ $ 1")؛) تابع replaceall (بازگشت str.replace (جدید regexp (escaperegexp (find)، "g")، جایگزینی)؛)

در اینجا نسخه بومی JS است که مسیر جی کوئری را باز می گرداند. من همچنین شناسه ها را برای اقلام اضافه می کنم. این به شما این امکان را می دهد که کوتاه ترین راه را به دست آورید اگر شناسه را در آرایه ببینید.

var path \u003d getdompath (عنصر)؛ console.log (path.join ("\u003e"))؛

بدن\u003e بخش: معادله (0)\u003e Div: EQ (3)\u003e بخش # محتوا\u003e بخش # Firehose\u003e Div # Fireehoselist\u003e مقاله # firehose-46813651\u003e header\u003e h2\u003e span # title-46813651

در اینجا یک تابع است.

تابع getdompath (el) (var stack \u003d؛ در حالی که (el.parentnode! \u003d null) (console.log (el.nodamame)؛ var sibcount \u003d 0؛ var sibindex \u003d 0؛ برای (var i \u003d 0؛ i< el.parentNode.childNodes.length; i++) { var sib = el.parentNode.childNodes[i]; if (sib.nodeName == el.nodeName) { if (sib === el) { sibIndex = sibCount; } sibCount++; } } if (el.hasAttribute("id") && el.id != "") { stack.unshift(el.nodeName.toLowerCase() + "#" + el.id); } else if (sibCount > 1) (stack.unshift (el.nodename.tolowce () + ": EQ (" + Sibindex + ")")؛ دیگر (stack.unshift (el.nodename.tolowce ())؛ el \u003d el.parentnode ؛ ) بازگشت stack.slice (1)؛ // عنصر HTML را حذف می کند)