2009-07-20 50 views
1

您不確定這是否可行,但我想要更新<主體>標籤來更改我的zend框架應用程序中的onload函數。使用zend框架更新身體標記中的javascript

應用程序正在使用的佈局使身體標記目前看起來像我從谷歌地圖加載此<體類=「trandra」 >

在我的觀點一個

但是,它需要以下在身體標記這期特別<身體的onload =「初始化()」 onunload的=「GUnload()」 >

正如你能理解我不希望這種情況在我的佈局進行硬編碼,因爲這會導致不所有的噩夢與不同的意見。

如何完成程序設計,如果完全有可能的話?即時通訊使用headScript函數來添加JavaScript所以是否有一個等效於身體標記?

在此先感謝...

回答

3

一個方法 - 使用可變佈局

一個想法是以下幾點:

<body class="trandra" <?php echo $this->layout()->bodyScripts ?>> 

而在你看來:

<?php 
    $this->layout->bodyScripts = 
     'onload="initialize()" onunload="GUnload()"'; 

方法2 - 附加JS文件,增加了事件處理程序

的另一種方法,這是不太顯眼,不會任何影響HTML是添加一個額外的JS-文件在需要嚴格的觀點onload和onunload處理程序。它可能是這個樣子:

<?php 
    $this->headScript()->appendScript(
         '/path/to/javascripts/loadGMaps.js'); 

在你loadGMaps.js(使用prototype

Event.observe(window, 'load', function onLoadHandler() { 
    // Code for initializing Google maps here 
}); 

Event.observe(window, 'unload', function onUnloadHandler() { 
    // Code for unloading Google maps here 
}); 
2

而不是把你的Javascript直接在代碼中,你也可以使用一個非obstrusive計算策略:在JavaScript堵塞時,頁面完全加載。

看一看,例如,在一個叫addOnLoadEvent功能

如果您使用的是JS框架(可以在很多網站^^找到),它肯定有那種特點:

如果您註冊了 「插入式」 使用h eadScript,應該不需要直接修改標籤。

0

我在Zend框架的專家,所以我不知道是否有在此功能的任何建設,但你可以做這樣的事情: 在佈局文件: body_params?>>

然後在你的控制器,可以設置或添加到body_params:

$this->view->body_params='onload="initialize()" onunload="GUnload()"'; 
0

我知道這是一個古老的線索,但我正在瀏覽一些建議的解決方案,並提出了我自己的想法之一,我看過一些想法。我所做的是我在我自己的庫文件擴展Zend_View的(我使用香草MVC佈局,但類似的事情可以做使用,而不是下面描述的引導類的bootstrap.php)

class Custom_View extends Zend_View 
{ 
    protected $bodyAttrs = array(); 

    public function _setBodyAttr($attrName,$attrValue=null) { 
     $attrName = strtolower(strval($attrName)); 
     if(!(in_array($attrName, HTML::getValidBodyAttrs()))) { 
      throw new Zend_Exception(__METHOD__." attrName '$attrName' is not a valid BODY attribute!"); 
     } 
     $this->bodyAttrs[$attrName] = strval($attrValue); 
    } 

    public function _getBodyAttrsAsString() { 
     $bodyAttrs = ""; 
     if(count($this->bodyAttrs) > 0) { 
      $attrs = array(); 
      foreach($this->bodyAttrs as $_k => $_v) { 
       array_push($attrs,sprintf("%s=\"%s\"", $_k, $_v)); 
      } 
      $bodyAttrs = " " . implode(" ", $tags); 
     } 
     return $bodyAttrs; 
    } 
} 

// some useful tag definitions for HTML 
class HTML 
{ 
    // HTML attributes as described by W3C 
    public static $BODY_ATTRIBUTES   = array('alink','background','bgcolor','link','text','vlink'); 
    public static $GLOBAL_ATTRIBUTES   = array('accesskey','class','contenteditable','contextmenu','dir','draggable','dropzone','hidden','id','lang','spellcheck','style','tabindex','title'); 
    public static $WINDOW_EVENT_ATTRIBUTES = array('onafterprint','onbeforeprint','onbeforeunload','onerror','onhaschange','onload','onmessage','onoffline','ononline','onpagehide','onpageshow','onpopstate','onredo','onresize','onstorage','onundo','onunload'); 
    public static $MOUSE_EVENT_ATTRIBUTES = array('onclick','ondblclick','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onmousedown','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onscroll'); 
    public static $KEYBOARD_EVENT_ATTRIBUTES = array('onkeydown','onkeypress','onkeyup'); 
    public static $FORM_EVENT_ATTRIBUTES  = array('onblur','onchange','oncontextmenu','onfocus','onformchange','onforminput','oninput','oninvalid','onreset','onselect','onsubmit'); 
    public static $MEDIA_EVENT_ATTRIBUTES = array('onabort','oncanplay','oncanplaythrough','ondurationchange','onemptied','onended','onerror','onloadeddata','onloadedmetadata','onloadstart','onpause','onplay','onplaying','onprogress','onratechange','onreadystatechange','onseeked','onseeking','onstalled','onsuspend','ontimeupdate','onvolumechange','onwaiting'); 

    public static function getValidBodyAttrs() { 
     return array_merge(self::$BODY_ATTRIBUTES,self::$GLOBAL_ATTRIBUTES,self::$WINDOW_EVENT_ATTRIBUTES,self::$MOUSE_EVENT_ATTRIBUTES,self::$KEYBOARD_EVENT_ATTRIBUTES); 
    } 
} 

創建此之後文件我添加了一個方法_initView到的bootstrap.php文件指向的index.php文件,並在的application.ini應用程序的根目錄下:

protected function _initView() 
{ 
    // Custom_View extends Zend_View 
    $view = new Custom_View(); 

    // Add it to the ViewRenderer 
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
    $viewRenderer->setView($view); 

    return $view; 
} 

新的,擴展的Zend_View現在允許沿增加你的身體標記有一些簡單的有效性檢查。修改你的佈局的身體標記獲取屬性:

<body<?= $this->_getBodyAttrs(); ?>> 

一旦你有了這個設置,你可以在控制器

$this->view->_setBodyAttr('key','val'); 

或增加你的身體標記任何給定的觀點

$this->_setBodyAttr('key','val');