called_position 페이지 로딩이 완료된후
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.3 |
이전 질문에 이어 질문드립니다 (https://xetown.com/questions/1232967)
이전에 플로팅 애드온 실행 시점이 파싱모듈이 유튜브를 표출하기 전이라 동작하지 않을수도 있다고 하셔서
애드온 출력이 언제 이뤄지는지 확인해보니
현재는 애드온 출력이
if($called_position == 'before_display_content'
되있었습니다
"모든 처리가 끝난 후 결과값을 출력하기 바로 직전인 DisplayHandler::printContent()에서 호출됩니다. 일반적으로 이 시점은 HTML/JSON/XMLRPC 출력 직전이며 출력 직전에 HTML/JSON/XMLRPC 의 변조를 하기 위할때 사용할 수 있습니다. 예를 들어 회원들의 포인트에 따른 레벨 아이콘등을 결과물에 추가할 수 있습니다."
라고 하는데 애드온 실행 시점을 페이지가 로드된 후, 결과값을 출력 한 이후 같은건없을까요? after_display_content 를 사용해보려고 했는데 존재하지 않는다더군요
스포
Lv. 5
댓글 10
ajax success나 complete 이후 시점에 플로팅 동작을 실행하게끔 하는 거죠.
(유튜브도 그렇게 될 수 있는지는 가물가물..)
아니면 링크 파싱 자체를 본문 출력이 아니라 본문 입력 단계에서 실행하도록 하는 것이 가장 근본적인 해결책일 텐데, 근본적 해결책인 만큼 전혀 다른 모듈로 제작을 해야겠죠;;;;
js 처리 시간이 비디오 관련 태그를 옮겨오는 것에 비해 링크를 파싱하는 시간이 더 걸리는 문제로 보이거든요.
즉, 문제를 해결하려면 파싱 이후에 js를 별도로 돌려주는 쪽으로 접근해야 할 것으로 생각합니다.
322번째줄 function getYoutube(i) 안에
function getYoutube(i) {
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
var matches = urls[i].match(regExp);
if (matches) {
var yt_id = matches[7];
var yt_list = urls[i].match('(list=[a-zA-Z0-9\-\_]+&?)');
yt_list = yt_list ? '?' + yt_list[0] : '';
var yt_cnt = $('#' + prefix + cnt + i),
yt_load = $('#' + prefix + load + i);
var _yt_frame = '<img id="' + yt_id + '" src="https://i.ytimg.com/vi/' + yt_id + '/mqdefault.jpg" style="display: none;">';
_yt_frame += '<iframe allowfullscreen="" frameborder="0" src="https://www.youtube.com/embed/' + yt_id + yt_list + '"></iframe>';
yt_cnt.html(_yt_frame);
var yt_frame = yt_cnt.children('iframe');
yt_frame.css({'width': '100%'});
$(yt_cnt.children('img#' + yt_id)).on('load', function () {
var ratio = this.height / this.width;
yt_frame.css({'height': yt_frame.width() * ratio});
$(window).on('resize', function () {
yt_frame.css('height', yt_frame.width() * ratio);
});
});
yt_cnt.css({'max-width': ap_parser_youtube_max, 'border': 'none'}).fadeIn('slow');
yt_load.hide();
if (ap_parser_link_text == 'delete') {
var p = yt_cnt.parent('.' + container).prev('p');
if (p.text().indexOf(urls[i]) != -1) {
if (p.text() == urls[i]) p.remove();
else p.html(p.text().replace(urls[i], ''));
}
}
} else getPreview(i);
*추가부분
$('head').append('<script src=\'floating_player.js\'><\/script>');
}
이렇게하면 맞을까요?
2. '추가부분'의 내용으로 스크립트가 (재)실행되는 게 아니라 head에 '추가'만 되는 것 같거든요. 그리고 js 파일의 경로도 저렇게 해도 되는지 모르겠습니다.