WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Скрипт копирования ссылок

С помощью аякс вывожу список ссылок вот такого формата

<div class="bar">
	<li>"//ссылка1",</li>
	<li>"//ссылка2",</li>
	<li>"//ссылка3",</li>
</div>

Подскажите скрипт который сможет в один клик скопировать все ссылки и вставить в заданное поле textarea ну или хотя бы просто скопировать.

Пробовал несколько скриптов, но они не работают, поскольку ссылки выводятся через аякс

0
lethalblo
месяц назад 5
  • 1
    el-lable235 cайт: el-lable.ru

    Мало данных, нужен пример структуры всех элементов.

    lethalblo месяц назад

    Поскольку я JS и PHP знаю очень поверхностно, то в итоге полный код получился вот таким.

    Стандартное подключение аякс скрипта

    add_action( 'wp_ajax_link_action', 'link_load' );
    add_action('wp_ajax_nopriv_link_action', 'link_load');
    
    add_action( 'wp_enqueue_scripts', 'load_jscss' );
    
    function load_jscss(){
    wp_enqueue_script('link-script', get_template_directory_uri() . '/js/scrs.js', '', '', 'true');
    	global $post;   
    wp_localize_script( 'link-script', 'linkurl', array( 'url' => admin_url( 'admin-ajax.php' ), 
    'nonce' => wp_create_nonce('ajax-defender'), 'postId' => $post->ID));
    }

    Дальше функция которая выполняет парсинг

    function link_load() { 
    
    	if( !wp_verify_nonce( $_POST['security'], 'ajax-defender' ) ){
    		wp_die('Ошибка безопасности!');
    	}
    
    $content = file_get_contents('ссылка на страницу');
    
    // Определяем позицию строки, до которой нужно все отрезать
     $pos = strpos($content, '<div class="bar">');
    
    //Отрезаем все, что идет до нужной нам позиции
    $content = substr($content, $pos);
    
    // Точно таким же образом находим позицию конечной строки
     $pos = strpos($content, '</div>');
    
     $content = str_replace('<div class="bar">','</div>', $content);
    
     $content = str_replace(['"//', '",'], ['<li>"//', '",</li>'], $content);
    
     // выводим спарсенный текст.
    echo $content;
    
    wp_die();
    }

    Также сам скрипт который срабатывает при клике и запускает функцию

    jQuery(document).ready(function($){
    		$('h5').click(function(){       
    		$.ajax({
    			type: "POST",
    			url: linkurl.url,
    			data: { 
    				security: linkurl.nonce,         
    				action: 'link_action',   
    				postId: linkurl.postId               
    			},          
    			success: function(res){                         
    				var j = $("#archi-links");
    				j.html(res);
    			},
    			error: function(){
    				alert('Error!');
    			}
    		});
    		return false;
    	});
    });

    На выходе получаем при клике на тег h5 в блоке с id archi-links получаем список ссылок вот в таком формате

    <li>"//ссылка1",</li>
    <li>"//ссылка2",</li>
    <li>"//ссылка3",</li>

    все ссылки я вывел в тегах li чтобы каждая была с новой строки. Теперь осталось добавить кнопку копировать все ссылки или содержимое ли. Возможно это нужно как-то по другому оформить, но в итоге на выходе нужно получить все сразу скопированные ссылки вот в таком виде без li

    "//ссылка1",
    "//ссылка2",
    "//ссылка3",
    el-lable месяц назад
    jQuery(function($){
    	$('h5').click(function(){
    		var $this = $(this);
    		if($this.hasClass('blocked')) return false;
    		$this.addClass('blocked');
    		$.ajax({
    			type: "POST",
    			url: linkurl.url,
    			data: { 
    				security: linkurl.nonce,         
    				action: 'link_action',   
    				postId: linkurl.postId               
    			},          
    			success: function(res){                         
    				var j = $("#archi-links");
    				j.html(res);
    				$this.removeClass('blocked');
    			},
    			error: function(){
    				alert('Error!');
    			}
    		});
    	});
    
    	/* add content to textarea */
    	var $textarea = $('#custom_textarea');
    	var $button = $('#custom_button');
    	var ns = "\r\n";
    	$button.click(function(e){
    		e.preventDefault();
    		var textareaContent = '';
    		$("#archi-links li").each(function(){
    			textareaContent += $(this).text() + ns;
    		});
    		$('#custom_textarea').val(textareaContent);
    	});
    });

    ну и ессно добавить сам элемент текстареа с указанным ID и кнопку по которой это все должно срабатывать тоже с нужным ID

    Код не проверял, должен работать, но может где-то ошибся, это пример принципа.

    lethalblo месяц назад

    Работает, спасибо за помощь.

    Хотя в конце поля ставит еще пустую строку, словно ентер нажали

    хотя если в ручную скопировать выводящий список, то такая же ситуация

    el-lable месяц назад
    $('#custom_textarea').val( $.trim(textareaContent) );
    lethalblo месяц назад

    вот теперь то что нужно, еще раз спасибо.

    lethalblo месяц назад

    Еще хочу поинтересоваться, как сделать, чтобы кнопка копировать выводилась в самой функции, а не просто на странице
    Ну примерно вот так:

    echo $content '<div id="custom_button">Копировать</div>';

    осталось только сделать, чтобы аякс запрос ее определял

    el-lable месяц назад

    какой вы нудный до чертиков...
    при чем тут айакс - это функция обработчик.
    вы хотите на лету вставить элемент и навешать на него функцию обработчик?

    lethalblo месяц назад

    Думаю да.

    el-lable месяц назад

    ну так и делайте это
    определяете неизменную зону и навешиваете в ней jQuery delegate

    lethalblo месяц назад

    Пробовал по разному, но вот такой вариант к примеру не работает

        var $textarea = $('#custom_textarea');
    	var $button = $('#custom_button');
    	var ns = "\r\n";
    	$button.delegate( "click", function(e) {
    		e.preventDefault();
    		var textareaContent = '';
    		$(".ozvucka li").each(function(){
    			textareaContent += $(this).text() + ns;
    		});
    		//$('#custom_textarea').val(textareaContent);
    		$('#custom_textarea').val($.trim(textareaContent));
    	});
    el-lable месяц назад

    нифига вы не поняли, на поклон - в хорошем смысле, я добрыйmosking

    lethalblo месяц назад

    Да я в принципе не особо много в этом понимаю, а объяснение навешиваете в ней jQuery delegate мне не говорит ничего. Ну загуглил, нашел пример с этим delegate применил как сумел.

    el-lable месяц назад

    смешноmosking

    lethalblo месяц назад

    Непонятно, что именно тебя так веселит, но в любом случаи спасибо помощь.

    el-lable месяц назад

    навешивание делегейтаmosking
    бгггmosking

    el-lable месяц назад
    $('тут селектор блока в котором будет ваш элемент, он неизменен и есть с самого начала загрузки страницы')
    .delegate('уточняющий селектор, т.е. тут может быть элемент который в последствии появится но с самого начала его нет', 'click', function(e){
    // ну и тут все как обычно
    });
    lethalblo 29 дней назад

    Справился с этим, когда прочитал чуть подробней о delegate

    Еще хочу сделать вот что
    У меня есть произвольное поле в которое я вставляю ссылку на страницу, где нужно что-то спарсить. Так вот приходиться каждый раз сохранять запись, чтобы ссылка в произвольном поле сохранилась и только тогда начинает работать скрипт.

    Хочу сделать, чтобы ссылка определялась без сохранения записи.

    Тоесть вот мое поле

    <input type="text" name="extra[link]" value="Ссылка" style="width:85%; float: right;">

    В него нужно добавить ссылку и налету ее вытащить скриптом и передать в функцию обработчик, чтобы там уже применить в виде переменной.
    С этим можешь помочь?

    lethalblo 27 дней назад

    Немного повозился и решил этот вопрос.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация