এইচটিএমএল ট্যাগ পরিবর্তন করতে jQuery ব্যবহার করবেন?


130

এটা কি সম্ভব?

উদাহরণ:

$('a.change').click(function(){
//code to change p tag to h5 tag
});


<p>Hello!</p>
<a id="change">change</a>

সুতরাং পরিবর্তন অ্যাঙ্কর ক্লিক করার ফলে <p>Hello!</p>বিভাগটি এইচ 5 ট্যাগে পরিবর্তিত হওয়া উচিত যাতে <h5>Hello!</h5>ক্লিকের পরে আপনি শেষ করতে চান । আমি বুঝতে পেরেছি আপনি পি ট্যাগ মুছতে এবং একটি h5 দিয়ে এটি প্রতিস্থাপন করতে পারেন, তবে আসলে কি কোনও HTML ট্যাগ সংশোধন করার আছে?

উত্তর:


211

একবার কোনও ডোম উপাদান তৈরি হয়ে গেলে ট্যাগটি পরিবর্তনযোগ্য, আমার বিশ্বাস। আপনাকে এরকম কিছু করতে হবে:

$(this).replaceWith($('<h5>' + this.innerHTML + '</h5>'));

2
দয়া করে নীচে আমার মন্তব্য দেখুন ... শৈলী প্রয়োগ করতে নথির কাঠামো পরিবর্তন করা সেরা পদ্ধতির নয়।
জ্রিস্টা

39
এই কোঁকড়াটি এমন কোনও বৈশিষ্ট্য না যা আপনি প্রতিস্থাপনকারী উপাদানটিতে থাকতে পারে? মুছে ফেলা শৈলী বৈশিষ্ট্য, উপাত্ত বৈশিষ্ট্য ইত্যাদির কারণে কিছু অপ্রত্যাশিত আচরণের কারণ হতে পারে ...
জাভি

5
"<" + el.outerHTML.replace(/(^<\w+|\w+>$)/g, "H5") + ">";বা প্লাগেবল jQuery ফাংশন: লিঙ্ক
তুলসী

65

এখানে একটি এক্সটেনশান যা সমস্ত কিছু করে দেবে, যতগুলি উপায়ে যতগুলি উপাদান রয়েছে ...

ব্যবহারের উদাহরণ:

বিদ্যমান শ্রেণি এবং বৈশিষ্ট্যগুলি রাখুন:

$('div#change').replaceTag('<span>', true);

অথবা

বিদ্যমান শ্রেণি এবং বৈশিষ্ট্যগুলি ত্যাগ করুন:

$('div#change').replaceTag('<span class=newclass>', false);

অথবা এমনকি

সমস্ত বিভাগগুলি স্প্যান, অনুলিপি ক্লাস এবং বৈশিষ্ট্যগুলির সাথে প্রতিস্থাপন করুন, অতিরিক্ত শ্রেণীর নাম যুক্ত করুন

$('div').replaceTag($('<span>').addClass('wasDiv'), true);

প্লাগইন উত্স:

$.extend({
    replaceTag: function (currentElem, newTagObj, keepProps) {
        var $currentElem = $(currentElem);
        var i, $newTag = $(newTagObj).clone();
        if (keepProps) {//{{{
            newTag = $newTag[0];
            newTag.className = currentElem.className;
            $.extend(newTag.classList, currentElem.classList);
            $.extend(newTag.attributes, currentElem.attributes);
        }//}}}
        $currentElem.wrapAll($newTag);
        $currentElem.contents().unwrap();
        // return node; (Error spotted by Frank van Luijn)
        return this; // Suggested by ColeLawrence
    }
});

$.fn.extend({
    replaceTag: function (newTagObj, keepProps) {
        // "return" suggested by ColeLawrence
        return this.each(function() {
            jQuery.replaceTag(this, newTagObj, keepProps);
        });
    }
});

2
হা. এবং রেকর্ডের জন্য, এমন অনেকগুলি বৈধ কারণ রয়েছে যা আপনি ট্যাগ পরিবর্তন করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি আপনার কোনও স্প্যানের মধ্যে ডিআইভি ট্যাগ থাকে, যা হেলা অ-মানক। পিডিবি প্রকাশের জন্য প্রিন্সএক্সএমএল-এর কঠোর মান নিয়ে কাজ করার সময় আমি এই ফাংশনটি থেকে প্রচুর ব্যবহার পেয়েছি ten
ওড়ওলোফিল

1
দেখতে সত্যিই দুর্দান্ত লাগছে, যদিও দুর্ভাগ্যজনকভাবে এটি প্রতিস্থাপিত উপাদানটির সমস্ত ইভেন্ট হারিয়ে ফেলে। সম্ভবত এটিও পরিচালনা করা যায় - দুর্দান্ত হবে!
এনপিসি

@ এনপিসি এটিই বড় শহরে জীবন। আপনি যদি উপাদানগুলি প্রতিস্থাপন করতে যাচ্ছেন, তবে হতাহতের ঘটনা ঘটতে চলেছে। আমি নিশ্চিত যে এখানে কেউ আছেন যিনি ইভেন্টগুলি ক্লোন করার জন্য প্রাসঙ্গিক jquery জানেন :)
অরওলোফিল

1
@ ফ্র্যাঙ্কওয়ানলুইজন @ অরওোওফিলটি প্লাগইনের "পুরানো সংস্করণ" -র মতো দেখানো return node;উচিত return this;। ইভেন্টগুলি একসাথে শৃঙ্খলার জন্য এটি প্রয়োজনীয়$("tr:first").find("td").clone().replaceTag("li").appendTo("ul#list")
কোল লরেন্স

1
আমি এটি পাই না, আপনার 2 টি ফাংশন প্রয়োজন কেন? আপনার কি দু'জনের দরকার? দুঃখিত, আমি হারিয়ে গেছি
জোও পাইমেন্তেল ফেরেরিরা

12

ট্যাগের ধরণ পরিবর্তন করার পরিবর্তে আপনার ট্যাগের স্টাইলটি পরিবর্তন করা উচিত (বা বরং কোনও নির্দিষ্ট আইডির সাথে ট্যাগ) এটা চেষ্টা কর:

$('a.change').click(function() {
    $('p#changed').css("font-weight", "bold");
});

<p id="changed">Hello!</p>
<a id="change">change</a>

3
এমনকি এই ক্ষেত্রেও, আপনার ডকুমেন্টের কাঠামোটি পরিবর্তন করা উচিত নয়। যদি আপনার সম্পাদনা বাটনে ক্লিক করার প্রতিক্রিয়াতে কোনও ইনপুট প্রদর্শন করতে হয়, তবে ইনপুটটি আটকে দিন এবং স্টিক প্রদর্শন: কোনওটিই নয় বা দৃশ্যমানতা: এতে লুকানো নেই। <h5> লুকান এবং বোতাম ক্লিকের প্রতিক্রিয়া হিসাবে <ইনপুট> দেখান। যদি আপনি ক্রমাগত আপনার নথির কাঠামো সংশোধন করে থাকেন ... আপনি কেবল রাস্তায় স্টাইল এবং লেআউটের সমস্যার একটি বালতিফুলের জন্য জিজ্ঞাসা করছেন।
জ্রিস্টা

1
একেবারে। আপনার জাভাস্ক্রিপ্টটি এম্বেড বা লিঙ্কযুক্ত, সুতরাং যদি আপনার উদ্বেগটি সুরক্ষা হয়, তবে সুরক্ষার প্রতি আপনার দৃষ্টিভঙ্গি কিছুটা ত্রুটিযুক্ত। ব্যবহারকারীর ভূমিকা অনুযায়ী আপনার ডকুমেন্টের সামগ্রীটি রেন্ডার করা উচিত ... ভূমিকাগুলির জন্য সামগ্রী মিশ্রণ সমস্যার কাছে যাওয়ার নিরাপদ উপায় নয়। কেউ যদি আপনার সিস্টেমে প্রশাসক হিসাবে লগ ইন করে থাকে তবে বিষয়বস্তু প্রশাসকের জন্য রেন্ডার করুন। যদি সেগুলি আপনার সিস্টেমে পাঠক হিসাবে লগ ইন থাকে তবে পাঠকের জন্য সামগ্রীটি রেন্ডার করুন। এটি সম্পূর্ণরূপে এমন সামগ্রী সরিয়ে দেয় যা অ্যাক্সেস করা উচিত নয়। সামগ্রীটি রেন্ডার হয়ে গেলে আপনার ডকুমেন্টকে স্টাইল করতে এবং স্টাফ প্রদর্শন / আড়াল করতে CSS ব্যবহার করুন।
জ্রিস্টা

2
আমি আপনার সাথে একমত এবং প্রকল্পে আপনার সুপারিশ গ্রহণ করেছি। আমি অ্যাডমিনের উপাদানগুলি প্রদর্শন করতে টগল () ব্যবহার করব যা কেবলমাত্র কোনও প্রশাসক লগ ইন করলেই রেন্ডার হয়। মূল প্রশ্নের সাথে সম্পর্কিত না হলেও (সরাসরি) মূলত আমি যেদিকে যাচ্ছিলাম তার চেয়ে সম্ভবত এটি আরও ভাল সমাধান। চিয়ার্স!
ক্রিস্টোফার কুপার

1
উ! খারাপ সুরক্ষার আরেকটি ব্লগ! একটি জয়, এবং সকলের জন্য রাউন্ড! (এখানে বিয়ারের আইকন )
োকান

1
নিরাপত্তার জন্য ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট ওপর নির্ভর আসলে খারাপ সব সময়ে কোন নিরাপত্তা থাকে। কেন? কারণ আপনি ভাবেন যে আপনার সুরক্ষা আছে, যখন বাস্তবে আপনি তা করেন না।
ব্রায়ানএইচ

8

আমি লক্ষ্য করেছি যে প্রথম উত্তরটি আমার প্রয়োজনের মতো নয়, তাই আমি বেশ কয়েকটি পরিবর্তন করেছি এবং অনুভব করেছি যে আমি এটি এখানে আবার পোস্ট করব।

উন্নত replaceTag(<tagName>)

replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])

যুক্তি:

  • ট্যাগনাম: স্ট্রিং
    • ট্যাগের নাম যেমন "ডিভ", "স্প্যান" ইত্যাদি
  • ডেটাএন্ডএভেন্টস সহ: বুলিয়ান
    • "একটি বুলিয়ান ইঙ্গিত দিচ্ছে যে ইভেন্ট হ্যান্ডলারগুলি উপাদানগুলির সাথে অনুলিপি করা উচিত কিনা j jQuery 1.4 হিসাবে, উপাদানগুলির ডেটাও অনুলিপি করা হবে।" তথ্য
  • ডিপ উইথডেটাএন্ড এভেন্টস: বুলিয়ান ,
    • একটি বুলিয়ান ইঙ্গিত দিচ্ছে যে ক্লোন করা উপাদানটির সমস্ত বাচ্চার ইভেন্ট ইভেন্ট হ্যান্ডলার এবং ডেটা অনুলিপি করা উচিত। ডিফল্টরূপে এর মান প্রথম যুক্তির মানের সাথে মেলে (যা মিথ্যাতে ডিফল্ট হয়) "" তথ্য

রিটার্নস:

একটি নতুন তৈরি jQuery উপাদান

ঠিক আছে, আমি জানি এখানে এখন কয়েকটি উত্তর রয়েছে তবে আমি এটি আবার লিখতে পেরেছিলাম।

এখানে আমরা ক্লোনিং ব্যবহার করি ঠিক তেমনভাবে ট্যাগটি প্রতিস্থাপন করতে পারি। আমরা .Cone এর সাথে একই সিনট্যাক্সটি অনুসরণ করছি withDataAndEventsএবং deepWithDataAndEventsযা ব্যবহারে শিশু নোডের ডেটা এবং ইভেন্টগুলি অনুলিপি করে ।

উদাহরণ:

$tableRow.find("td").each(function() {
  $(this).clone().replaceTag("li").appendTo("ul#table-row-as-list");
});

উৎস:

$.extend({
    replaceTag: function (element, tagName, withDataAndEvents, deepWithDataAndEvents) {
        var newTag = $("<" + tagName + ">")[0];
        // From [Stackoverflow: Copy all Attributes](http://stackoverflow.com/a/6753486/2096729)
        $.each(element.attributes, function() {
            newTag.setAttribute(this.name, this.value);
        });
        $(element).children().clone(withDataAndEvents, deepWithDataAndEvents).appendTo(newTag);
        return newTag;
    }
})
$.fn.extend({
    replaceTag: function (tagName, withDataAndEvents, deepWithDataAndEvents) {
        // Use map to reconstruct the selector with newly created elements
        return this.map(function() {
            return jQuery.replaceTag(this, tagName, withDataAndEvents, deepWithDataAndEvents);
        })
    }
})

নোট করুন যে এটি নির্বাচিত উপাদানটিকে প্রতিস্থাপন করে না , এটি সদ্য নির্মিতটিকে ফিরিয়ে দেয়।


2
সচেতন থাকুন যাতে .children()কোনও বিশুদ্ধ পাঠ্য নোড অন্তর্ভুক্ত হবে না। আপনি .contents()আইআইআরসি চেষ্টা করতে চাইতে পারেন ।
অরওলোফিল

5

আইডিয়াটি উপাদানটি মোড়ানো এবং বিষয়বস্তু আনপোট করা হয়:

function renameElement($element,newElement){

    $element.wrap("<"+newElement+">");
    $newElement = $element.parent();

    //Copying Attributes
    $.each($element.prop('attributes'), function() {
        $newElement.attr(this.name,this.value);
    });

    $element.contents().unwrap();       

    return $newElement;
}

নমুনা ব্যবহার:

renameElement($('p'),'h5');

ডেমো


0

আমি এমন একটি পদ্ধতির সাথে উপস্থিত হয়েছি যেখানে আপনি আপনার jQuery অবজেক্টের স্ট্রিং উপস্থাপনা ব্যবহার করেন এবং নিয়মিত অভিব্যক্তি এবং বেসিক জাভাস্ক্রিপ্ট ব্যবহার করে ট্যাগের নামটি প্রতিস্থাপন করেন। আপনি কোনও সামগ্রী আলগা করবেন না এবং প্রতিটি বৈশিষ্ট্য / সম্পত্তি থেকে লুপ করতে হবে না।

/*
 * replaceTag
 * @return {$object} a new object with replaced opening and closing tag
 */
function replaceTag($element, newTagName) {

  // Identify opening and closing tag
  var oldTagName = $element[0].nodeName,
    elementString = $element[0].outerHTML,
    openingRegex = new RegExp("^(<" + oldTagName + " )", "i"),
    openingTag = elementString.match(openingRegex),
    closingRegex = new RegExp("(<\/" + oldTagName + ">)$", "i"),
    closingTag = elementString.match(closingRegex);

  if (openingTag && closingTag && newTagName) {
    // Remove opening tag
    elementString = elementString.slice(openingTag[0].length);
    // Remove closing tag
    elementString = elementString.slice(0, -(closingTag[0].length));
    // Add new tags
    elementString = "<" + newTagName + " " + elementString + "</" + newTagName + ">";
  }

  return $(elementString);
}

অবশেষে, আপনি নিম্নরূপে বিদ্যমান বস্তু / নোড প্রতিস্থাপন করতে পারেন:

var $newElement = replaceTag($rankingSubmit, 'a');
$('#not-an-a-element').replaceWith($newElement);

0

এটা আমার সমাধান। এটি ট্যাগের মধ্যে টগল করতে দেয়।

<!DOCTYPE html>
<html>
<head>
	<title></title>

<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
<script type="text/javascript">

function wrapClass(klass){
	return 'to-' + klass;
}

function replaceTag(fromTag, toTag){
	
	/** Create selector for all elements you want to change.
	  * These should be in form: <fromTag class="to-toTag"></fromTag>
	  */
	var currentSelector = fromTag + '.' + wrapClass(toTag);

	/** Select all elements */
	var $selected = $(currentSelector);

	/** If you found something then do the magic. */
	if($selected.size() > 0){

		/** Replace all selected elements */
		$selected.each(function(){

			/** jQuery current element. */
			var $this = $(this);

			/** Remove class "to-toTag". It is no longer needed. */
			$this.removeClass(wrapClass(toTag));

			/** Create elements that will be places instead of current one. */
			var $newElem = $('<' + toTag + '>');

			/** Copy all attributes from old element to new one. */
			var attributes = $this.prop("attributes");
			$.each(attributes, function(){
				$newElem.attr(this.name, this.value);
			});

			/** Add class "to-fromTag" so you can remember it. */
			$newElem.addClass(wrapClass(fromTag));

			/** Place content of current element to new element. */
			$newElem.html($this.html());

			/** Replace old with new. */
			$this.replaceWith($newElem);
		});

		/** It is possible that current element has desired elements inside.
		  * If so you need to look again for them.
		  */
		replaceTag(fromTag, toTag);
	}
}


</script>

<style type="text/css">
	
	section {
		background-color: yellow;
	}

	div {
		background-color: red;
	}

	.big {
		font-size: 40px;
	}

</style>
</head>
<body>

<button onclick="replaceTag('div', 'section');">Section -> Div</button>
<button onclick="replaceTag('section', 'div');">Div -> Section</button>

<div class="to-section">
	<p>Matrix has you!</p>
	<div class="to-section big">
		<p>Matrix has you inside!</p>
	</div>
</div>

<div class="to-section big">
	<p>Matrix has me too!</p>
</div>

</body>
</html>


0

JQuery ব্যবহার করে আপনার ডোমের অভ্যন্তরে এইচটিএমএল ট্যাগগুলি পরিবর্তন করার এই দ্রুত উপায়। আমি এই প্রতিস্থাপনের সাথে () ফাংশনটি খুব দরকারী।

   var text= $('p').text();
   $('#change').on('click', function() {
     target.replaceWith( "<h5>"+text+"</h5>" );
   });

0

আপনি এটির অর্জন করতে পারেন data-*অ্যাট্রিবিউট মত data-replace="replaceTarget,replaceBy"পেতে jQuery এর সাহায্যে তাই replaceTarget& replaceByদ্বারা মান .split()পেয়ে মান তারপর ব্যবহারের পরে পদ্ধতি .replaceWith()পদ্ধতি। নীচে পরিবর্তন না করে যে কোনও ট্যাগ প্রতিস্থাপন সহজেই পরিচালনা করার জন্য
এই data-*অ্যাট্রিবিউট কৌশলটি (সমস্ত ট্যাগ প্রতিস্থাপনের জন্য সাধারণ কোড)।

আমি আশা করি নীচে স্নিপেট আপনাকে অনেক সাহায্য করবে।

$(document).on('click', '[data-replace]', function(){
  var replaceTarget = $(this).attr('data-replace').split(',')[0];
  var replaceBy = $(this).attr('data-replace').split(',')[1];
  $(replaceTarget).replaceWith($(replaceBy).html($(replaceTarget).html()));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<p id="abc">Hello World #1</p>
<a href="#" data-replace="#abc,<h1/>">P change with H1 tag</a>
<hr>
<h2 id="xyz">Hello World #2</h2>
<a href="#" data-replace="#xyz,<p/>">H1 change with P tag</a>
<hr>
<b id="bold">Hello World #2</b><br>
<a href="#" data-replace="#bold,<i/>">B change with I tag</a>
<hr>
<i id="italic">Hello World #2</i><br>
<a href="#" data-replace="#italic,<b/>">I change with B tag</a>


0

নিম্নলিখিত ফাংশনটি কৌশলটি করে এবং সমস্ত বৈশিষ্ট্য রাখে। আপনি উদাহরণস্বরূপ এটি ব্যবহার করুন:changeTag("div", "p")

function changeTag(originTag, destTag) {
  while($(originTag).length) {
    $(originTag).replaceWith (function () {
      var attributes = $(this).prop("attributes");
      var $newEl = $(`<${destTag}>`)
      $.each(attributes, function() {
        $newEl.attr(this.name, this.value);
      });  
      return $newEl.html($(this).html())
    })
  }
}

এটি কাজ করে তা নিশ্চিত হতে নীচের উদাহরণটি দেখুন

function changeTag(originTag, destTag) {
  while($(originTag).length) {
    $(originTag).replaceWith (function () {
      var attributes = $(this).prop("attributes");
      var $newEl = $(`<${destTag}>`)
      $.each(attributes, function() {
        $newEl.attr(this.name, this.value);
      });  
      return $newEl.html($(this).html())
    })
  }
}

changeTag("div", "p")

console.log($("body").html())
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="A" style="font-size:1em">
  <div class="B" style="font-size:1.1em">A</div>
</div>
<div class="C" style="font-size:1.2em">
  B
</div>
</body>


-1

আপনি ট্যাগ পরিবর্তন করার একটি নির্দিষ্ট কারণ আছে? আপনি যদি কেবল এই পাঠ্যটিকে আরও বড় করতে চান তবে পি ট্যাগটির সিএসএস ক্লাস পরিবর্তন করা আরও ভাল উপায়।

এটার মতো কিছু:

$('#change').click(function(){
  $('p').addClass('emphasis');
});

আমি উপাদানটি / ট্যাগ পরিবর্তন করতে বলার কারণ হ'ল পৃষ্ঠার অন্য কোনও জায়গায় "সম্পাদনা" বোতামটি ক্লিক করা হলে আমি একটি ট্যাগ (একটি <h5>, প্রকারটি অপ্রাসঙ্গিক হলেও) একটি <ইনপুট> এ পরিবর্তন করার চেষ্টা করছি because ।
ক্রিস্টোফার কুপার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.