javascript 위치를 </body> 태그전에 위치하게하기 - HOOK
javascript를 </body></html>태그전에 위치시킬 필요가 있을 경우
그누보드의 add_javascript()를 수정하지 않고 add_tail_javascript()를 추가해서 </body>태그전에 javascript를 위치하게 하는 방법입니다.
/lib/common.lib.php
1. add_javascript()다음에 아래 코드 삽입
function add_tail_javascript($javascript, $order=0)
{
global $html_process;
if(trim($javascript) && method_exists($html_process, 'merge_tail_javascript') )
$html_process->merge_tail_javascript($javascript, $order);
}
2. merge_javascript()다음에 아래 코드 삽입
function merge_tail_javascript($javascript, $order)
{
$tail_scripts = $this->tail_js;
$is_merge = true;
foreach($tail_scripts as $script) {
if($script[1] == $javascript) {
$is_merge = false;
break;
}
}
if($is_merge)
$this->tail_js[] = array($order, $javascript);
}
3. run()... 부분
if(!empty($scripts)) {
...
}
하단에 아래코드 삽입
$tail_javascript = '';
$tail_scripts = $this->tail_js;
$php_eol = '';
unset($order);
unset($index);
if(!empty($tail_scripts)) {
foreach ($tail_scripts as $key => $row) {
$order[$key] = $row[0];
$index[$key] = $key;
$script[$key] = $row[1];
}
array_multisort($order, SORT_ASC, $index, SORT_ASC, $tail_scripts);
$tail_scripts = run_replace('html_process_script_files', $tail_scripts);
foreach($tail_scripts as $js) {
if(!trim($js[1]))
continue;
$js[1] = preg_replace('#.js(['"]?>)</script>$#i', '.js?ver='.G5_JS_VER.'$1</script>', $js[1]);
$tail_javascript .= $php_eol.$js[1];
$php_eol = PHP_EOL;
}
}
4. $buffer = preg_replace('#(</head>[^<]*<body[^>]*>)#', "$javascript{$nl}$1", $buffer); 하단에 아래 코드 삽입
$nl = '';
if($tail_javascript)
$nl = "n";
$buffer = preg_replace('#(</body>[^<]*</html[^>]*>)#', "$tail_javascript{$nl}$1", $buffer);
사용방법은 add_javascript()와 같습니다.
<?php
add_tail_javascript('<script src="'.G5_JS_URL.'/jquery-1.12.4.min.js"></script>', 0);
?>
---- hook 버전 ----
아래와 같이 php 를 작성한 후...
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
add_event('tail_sub', 'final_javascript');
function final_javascript() {
echo "<script src=js주소></script>";
}
extend 폴더에 업로드 하면 "땡" 입니다. 파일이름은 아무 이름이나 줘도 상관없구요.
자바스크립트 소스는 js 파일로 만들어서 주소를 추출하여 소스 부분에서 대입시켜 줍니다.
이 소스가 위치할 부분은 tail.sub.php 의 <?php run_event('tail_sub'); ?> 이기 때문에
</body> 바로 앞에서 실행이 되는 최후(?)의 자바스크립트가 되겠지요.
---------
약간 더 내용을 첨가하자면 일반페이지가 아니라 게시글의 view 에서만 먹히는 자바스크립트 소스를 사용하려면...
js파일에서 아래의 조건문 안으로 넣어 주세요.
if (typeof bo_v_con != "undefined") {
}
bo_v_con 은 게시글을 담는 div 의 id 입니다. 다른 경우에 적용할 때도
"typeof 엘레먼트 id 언디파인드 부정" 을 조건문에 넣어서 작성하면 페이지마다 다른 자바스크립트를 마지막에 줄 수 있습니다.