მიუხედავად იმისა რომ ელემენტის innerHTML თვისება არ არის w3c სტანდარტის მიერ დამტკიცებული, დღესდღეობით იგი წარმოადგენს დეფაქტო სტანდარტს და ფართოდ გამოიყენება თანამედროვე ვებ აპლიკაციებში რაც გამოწვეულია იმით რომ იგი ბევრად სწრაფია w3c DOM ფუნქციებთან შედარებით. ამ თვისების გამოყენება შესაძლებელია ყველა თანამედროვე ბროუზერში თუმცა უნდა აღინიშნოს ის ფაქტი რომ მის გამოყენებას ახლავს გარკვეული სირთულეები, კერძოდ კი table და form ელემენტებთან მუშაობის დროს.
innerHTML შეიქმნა Microsoft – ის მიერ Internet Explorer – ისთვის, თუმცა მოგვიანებით სხვა ბროუზერების მწარმოებლებმაც ჩადეს ელემენტის ეს თვისება თავის პროდუქტებში, ასე რომ არსებული(თუმცა მცირე) პრობლემების მიუხედავად საჭიროების შემთხვევაში არ უნდა ავარიდოთ თავი მის გამოყენებას.
ოფიციალურ დოკუმენტაციაში ამ თვისების განმარტებები თითქმის იდენტურია:
Sets or retrieves the HTML between the start and end tags of the object.
innerHTML sets or gets all of the markup and content within a given element.
განმარტება გვეუბნება რომ ეს თვისება ან ჩასვავს კოდსა და ტექტს მოცემული ელემენტის შიგნით, ან დააბრუნებს მის შიგნით არსებულ კოდსა და ტექსტს.
როგორც ოფიციალურ დოკუმენტაციაშია ნაჩვენები ამ თვისების გამოყენება ძალიან მარტივია, თუმცა გარდა HTML კოდის პირდაპირ კოპირებისა ან ჩასმისა ელემენტიდან ელემენტში(რაც ამ თვისების პირდაპირი დანიშნულებაა) მისი გამოყენება ასევე შეიძლება HTML კოდის ჩვეულებრივ ტექსტად გარდაქმნისათვის(მაგ. მსგავსი რამ PHP-ში შესაძლებელია htmlspecialchars ფუნქციის გამოყენებით).
ქვემოთ მოყვანილია მაგალითი რომელიც ერთი ელემენტიდან მეორეში აკოპირებს HTML კოდს ან უბრალო ტექსტის სახით ან პირდაპირ როგორც HTML კოდს:
Click to copy text | Click to copy HTML
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
ლინკებზე(Click to copy text და Click to copy HTML) ისრის დაწკაპუნებისას პირველი კონტეინერის შემადგენელი HTML კოდი და ტექსტი კოპირდება მეორე კონტეინერში ან პირდაპირ როგორს სტრიქონი(ამ შემთხვევაში HTML კოდის გადაყვანა ხდება სტრიქონში) ან როგორც HTML კოდი.
innerHTML – ს პირდაპირი და მთავარი დანიშნულებაა რომ ელემენტიდან ამოვიღოთ ან მასში ჩავსვათ HTML და ეს პროცედურა დამატებით ახსნას არ საჭიროებს. თუმცა ისეთ შემთხვევაში თუ გვინდა რომ HTML ვაქციოთ უბრალო სტრიქონად საჭიროა შესაბამისი ფუნქციის რეალიზაცია.
ქვემოთ მოყვანილია მაგალითში გამოყენებული HTML და JavaScript კოდი შესაბამისი განხილვით:
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
[/html]
კოდში გამოყენებულია ორი a ელემენტი რომლებიც იძახებენ copyContent ფუნქციას შესაბამისი პარამეტრებით, და ორი div ელემენტი:
- html-container – რომელიც შეიცავს სხვა ელემენტებსა და ტექსტს
- text-container – რომელშიც უნდა მოხდეს html-container ელემენეტში არსებული კოდის კოპირება
[javascript]
/**
*param string
*/
function htmlspecialchars(text) {
//create temporary div element
var div = document.createElement(“div”);
//create and append text node to div element
div.appendChild(document.createTextNode(text));
//return transofrmed string
return div.innerHTML;
}
/**
*param boolean
*/
function copyContent(copyText) {
//get html container
var htmlContainer = document.getElementById(“html-container”);
//get text container
var textContainer = document.getElementById(“text-container”);
if (copyText) {
//if copyText parameter was set to true escape contents of htmlContainer object
textContainer.innerHTML = htmlspecialchars(htmlContainer.innerHTML);
} else {
//just copy HTML from one container to other
textContainer.innerHTML = htmlContainer.innerHTML;
}
return false;
}
[/javascript]
ზემოთ აღნიშნული ოპერაციების განსახორციელებლად გამოიყენება ორი ფუნქცია, copyContent რომელიც ღებულობს ერთ პარამეტრს და ამ პარამეტრის შესაბამისად ან უბრალოდ სვავს text-container ელემენტში html-container ელემენტის შიგნით არსებულ HTML კოდს, ან იძახებს htmlspecialchars ფუნქციას რათა მოხდეს კოდის გადაყვანა ჩვეულებრივ სტრიქონში და text-container ელემენტში სვავს უბრალოდ სტრიქონს.
საინტერესო ამ კოდში არის სწორედ htmlspecialchars ფუნქცია რომლის გამოყენება(და დანიშნულება) ანალოგიურია PHP – ს იგივე დასახელების მქონე ფუნქციისა. იგი პარამეტრად ღებულობს HTML კოდს(რომლის გადაყვანაც უნდა მოხდეს ჩვეულებრივ სტრიქონში) და აბრუნებს ჩვეულებრივ სტრიქონს. ეს ყველაფერი მიიღწევა DOM მეთოდების გამოყენებით:
- document.createElement(“div”) – კოდი ქმნის დროებით div ელემენტს
- div.appendChild(document.createTextNode(text)) – კოდში createTextNode მეთოდის გამოყენებით ვქმნით ტექსტურ ელემენტს რომელსაც პარამეტრად გადავცემთ text ცვლადს(აქ მნიშვნელოვანია სწორედ createTextNode მეთოდი რომლის მეშვეობითაც ხდება HTML კოდის ჩვეულებრივ სტრიქონად გარდაქმნა) და ვამატებთ ამ ელემენტს წინასწარ შექმნილ div ელემენტში.
- return div.innerHTML – div ელემენტის innerHTML თვისება უკვე შეიცავს სტრიქონს ნაცვლად HTML კოდისა.
ამ მაგალითში ნაჩვენები იყო თუ როგორ შეიძლება უფრო სასარგებლოდ გამოვიყენოთ ელემენტის innerHTML თვისება და რამდენად სასარგებლო შეიძლება იყოს იგი რიგ შემთხვევებში.
P.S.
მაგალითში გამოყენებულია ლათინური ტექსტი(Lorem ipsum… და ა.შ.) რის შესახებაც ინფორმაცია შეგიძლიათ იხილოთ შესაბამის რესურსზე.
ტეგები: JavaScript, JavaScript DOM
გარდა იმისა რომ სტანდარტი არაა, .innerHTML-ის გამოყენება არ შეიძლება ორი ბევრად უფრო სერიოზული მიზეზის გამო:
1) innerHTML-ის გამოყენებით შექმნილი საიტი XHTML თავსებადი ვერასოდეს იქნება
2) innerHTML-ის გამოყენებისას DOM-ის სტრუქტურა ირღვევა
სტანდარტი რომ არ არის ეგ არაფერს ნიშნავს ჩემის აზრით… არც XMLHttpRequest არის სტანდარტი…
სერიოზულ მიზეზებს რაც შეეხება:
innerHTML – ის გამოყენებით შექმნილი საიტი რას ნიშნავს? იგი შეიძლება გამოვიყენოთ საიტის ნაწილების დინამიურად განახლებისათვის და XHTML იქნება თუ არა მუშაობის მომენტში საიტი/აპლიკაცია აქვს ამას რაიმე გადამწყვეტი მნიშვნელობა?
რაც შეეხება DOM – ის სტრუქტურას, მართლაც ირღვევა მაგრამ ჯერ ერთი რომ მსგავსი მდგომარეობიდან არსებობს გამოსავალი რაზეც სხვა პოსტში მექნება ლაპარაკი… მეორეც ის რომ innerHTML – ის გამოყენება არ უნდა ვაქციოთ პათოლოგიად… საჭიროების შემთხვევაში საჭირო დროს უნდა გამოვიყენოთ
მაგრად მაინტერესებს კონკრეტულად რა ირღვევა DOM სტრუქტურაში innedHTML ის გამოყენებით?
დავწერ ლევან მოგვიანებით მაგის შესახებ სხვა პოსტში… აქვს პრობლემები innerHTML – ს და DOM – საც კაცურად არღვევს
ხო წავიკითხ წამოვიკჳთხე(დამაინტრიგა ) და როგორც ჩანს რაც innedHTML-ში შედის DOM ის ნაწილი (სრული ობიექტი) არ ხდება არამედ უბრალო String ? მასეა ხო დაახლოებით?
[...] áá¦áááááááá RIA áá ááá áááá áááá¡ááááá¡(ááªáá áááááá á¨áá¡ááááá á¨áá¡áá«ááááááá á¬áá…), ááá áá áá¡ á¡á¬á áá¤á, áá¤áá¥á¢á£á á áá á á᪠[...]
რა მაინტერესებს, innerHTML-ს გამოყენებით, მთლიანი html დოკუმენტი როგორ წავაკითხინო ? ასე ვცადე მაგრამ არ გამომივიდა document.getElementsByTagName(‘html’).innerHTML მარა არ ქნა და ვერ მეტყვით როგორ გავაკეთო ასე ვთქვათ ?
@ადამიანი
document.getElementsByTagName(‘html’) აბრუნებს მასივს, ანუ დოკუმენტში html ტეგის რაოდენობის ზომის მასივს და შესაბამისად მასივს innerHTML არ ექნება.
თუ სტანდარტული დოკუმენტი გაქვს მაშინ შეგიძლია ესე აიღო -
var htmlObjs = document.getElementsByTagName(‘html’);
და შემდეგ htmlObjs[0].innerHTML დაგიბრუნებს შენი დოკუმეტის შიგთავსს