Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как выполнить код при появлении элемента? (https://javascript.ru/forum/jquery/65312-kak-vypolnit-kod-pri-poyavlenii-ehlementa.html)

snovapavel 12.10.2016 13:15

Как выполнить код при появлении элемента?
 
Добрый день!

Написал функцию, которая автоматически чистит атрибут title у изображений в Админ-панели. Но беда в том, что окно загрузки появляется через Ajax и естественно функция не срабатывает.

Как отследить, что элемент на странице появился и только тогда выполнить скрипт?

Вот он сам:

$( 'head' ).append( '<script>jQuery( document ).ready( function( $ ) { $(\'.media-sidebar label[data-setting="title"] input[type="text"]\').val(\'\'); } );</script>' );

Coriolan161 12.10.2016 13:56

snovapavel,
У тебя в аяксе должен быть успешный колбек в него и запихай свой хеад аппенд

snovapavel 12.10.2016 14:15

Не понимаю о чём речь... Нельзя просто постоянно отслеживать появление элемента на странице?

Aetae 12.10.2016 14:19

Если страничка твоя - то изменения надо вносить сразу в код отрисовки нужного окошка, а не через зад. Если это юзерскрипт, или хак какой - тогда так и говори.

snovapavel 12.10.2016 14:26

Юзерскрипт, конечно.


Вот мой скрипт:

// ==UserScript==
// @name         Processing site.ru
// @version      0.1
// @author       Ivan
// @match        [url]http://site.ru/*[/url]
// @require      [url]http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js[/url]
// @run-at       document-start
// ==/UserScript==

$(document).ready(function() {
  var $ = window.jQuery;

  $( 'head' ).append( '<script>jQuery( document ).ready( function( $ ) { $(\'.media-sidebar label[data-setting="title"] input[type="text"]\').val(\'\'); } );</script>' );

});

Aetae 12.10.2016 19:53

Я у себя использую подобный скрипт для вмешательства в чужой код(пример конкретно с ajax):
function waitFor(obj, ...props){
  var callback = props.pop();

  function isPrimitive(obj){
    return !["function", "object"].includes(typeof obj);
  }
  
  function next(obj, prop){
    if(props.length) return defineSetter(obj[prop], props.shift());
    callback(obj, prop);
  }

  function defineSetter(obj, prop){
    if(isPrimitive(obj)) 
      return console.error(`Object needed. Can not wait for property "${prop}" in primitive "${obj}".`);
    
    if(prop in obj) return next(obj, prop);
    
    Object.defineProperty(obj, prop, {
      enumerable: false,
      configurable: true,
      set: function(value) {
        delete obj[prop];
        obj[prop] = value;
        next(obj, prop);
      }
    })    
  }
  
  if(isPrimitive(obj)) 
    return console.error(`Object needed. Can not wait for properties in primitive "${obj}".`);
  if(!props.length) 
    return console.error('No properties to wait was specified.');
  
  defineSetter(obj, props.shift());
}

function decorate(func, callback){ 
  var out = function(){
    return func.apply(this, callback.apply(this, arguments) || arguments)
  };
  out.prototype = Object.create(func.prototype);
  return out;
}

function replace(text){
    return [
        text.replace(/foo/g, 'bar') //заменяем в полученном ajax ответе foo на bar
    ];
}

waitFor(unsafeWindow, '$', 'ajax', function($, ajax){ //ждём пока подгрузится $.ajax
  $.ajax = decorate($.ajax, function(options){ //подменяем $.ajax
    if(options && options.url ) console.log(url); //логируем url запроса
    if(options && options.success && options.url && options.url.startsWith('/some/')) 
      options.success = decorate(options.success, replace); //подменяем коллбэк для запросов на url начинающихся с "/some/"
  });
})
Писано на коленке, так что можно наверное красивей и лучше, но "работает и не трогаю".)

laimas 12.10.2016 20:38

Цитата:

Сообщение от snovapavel
автоматически чистит атрибут title у изображений

И каким образом это

$('.media-sidebar label[data-setting="title"] input[type="text"]').val('')


может очищать автоматически атрибут title изображений?


Часовой пояс GMT +3, время: 15:01.