{"id":36817,"date":"2026-09-23T06:40:37","date_gmt":"2026-09-23T06:40:37","guid":{"rendered":"https:\/\/www.juweihammer.com\/?page_id=36817"},"modified":"2026-09-23T11:08:43","modified_gmt":"2026-09-23T11:08:43","slug":"drive-cap-3d-assembly-test","status":"publish","type":"page","link":"https:\/\/www.juweihammer.com\/fr\/drive-cap-3d-assembly-test\/","title":{"rendered":"Drive Cap 3D Assembly Test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"36817\" class=\"elementor elementor-36817\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b5e54d8 e-con-full e-flex e-con e-parent\" data-id=\"b5e54d8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8358958 elementor-widget elementor-widget-html\" data-id=\"8358958\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<iframe\r\n  id=\"juwei-configurator\"\r\n  src=\"\/drive-system\/drive-cap-3d-source\/index.html?v=20260923-9\"\r\n  title=\"3D Product Configurator\"\r\n  style=\"display:block;width:100%;height:600px;border:0;\"\r\n  allow=\"fullscreen\"\r\n  allowfullscreen>\r\n<\/iframe>\r\n\r\n<script>\r\n(function () {\r\n  const frame = document.getElementById('juwei-configurator');\r\n  if (!frame) return;\r\n\r\n  function fitFrame() {\r\n    const top = Math.max(0, frame.getBoundingClientRect().top);\r\n    const available = window.innerHeight - top - 16;\r\n    const height = Math.max(480, available);\r\n    const value = height + 'px';\r\n\r\n    if (frame.style.height !== value) {\r\n      frame.style.height = value;\r\n    }\r\n  }\r\n\r\n  function connectFrame() {\r\n    fitFrame();\r\n\r\n    try {\r\n      const doc = frame.contentDocument;\r\n      if (!doc || !doc.querySelector('[data-pie-assembly-test]')) return;\r\n      if (doc.documentElement.dataset.juweiConnected) return;\r\n      doc.documentElement.dataset.juweiConnected = '1';\r\n\r\n      doc.addEventListener('click', function (event) {\r\n        if (!event.target.closest('[data-choice]')) return;\r\n\r\n        const rect = frame.getBoundingClientRect();\r\n\r\n        \/\/ \u5c4f\u5e55\u5269\u4f59\u7a7a\u95f4\u4e0d\u8db3\u65f6\uff0c\u5148\u5c06\u6574\u4e2a\u64cd\u4f5c\u533a\u79fb\u5165\u89c6\u91ce\u3002\r\n        if (rect.bottom > window.innerHeight && rect.top > 16) {\r\n          window.scrollBy({\r\n            top: rect.top - 16,\r\n            behavior: 'smooth'\r\n          });\r\n        }\r\n      });\r\n    } catch (error) {\r\n      console.warn('Configurator frame:', error);\r\n    }\r\n  }\r\n\r\n  frame.addEventListener('load', connectFrame);\r\n  window.addEventListener('resize', fitFrame);\r\n  window.addEventListener('scroll', fitFrame, { passive: true });\r\n\r\n  fitFrame();\r\n  connectFrame();\r\n})();\r\n<\/script>\r\n<!-- Paste this entire block AFTER the existing iframe in the same Elementor HTML widget.\r\n     Keep the existing Elementor Form widget, whose CSS ID is juwei-quote-form. -->\r\n<style>\r\n  \/* Keep the real Elementor Pro form active while hiding its duplicate UI. *\/\r\n  #juwei-quote-form {\r\n    position: absolute !important;\r\n    width: 1px !important;\r\n    height: 1px !important;\r\n    overflow: hidden !important;\r\n    clip-path: inset(50%) !important;\r\n    white-space: nowrap !important;\r\n  }\r\n<\/style>\r\n<script nowprocket>\r\n(function () {\r\n  'use strict';\r\n  if (window.__juweiQuoteBridgeInstalled) return;\r\n  window.__juweiQuoteBridgeInstalled = true;\r\n\r\n  var CART_KEY = 'pie_quote_cart_v2';\r\n  var nativeForm;\r\n  var pending;\r\n\r\n  function findFrame() {\r\n    return document.querySelector('#juwei-configurator, iframe[src*=\"\/drive-system\/drive-cap-3d-source\/index.html\"], iframe[data-lazy-src*=\"\/drive-system\/drive-cap-3d-source\/index.html\"]');\r\n  }\r\n\r\n  function readCart(frameWindow) {\r\n    try {\r\n      var stored = JSON.parse(frameWindow.localStorage.getItem(CART_KEY) || 'null');\r\n      if (!stored || !Array.isArray(stored.items) || stored.expires < Date.now()) return [];\r\n      return stored.items.filter(function (item) { return item && item.name && Number(item.qty) > 0; });\r\n    } catch (error) { return []; }\r\n  }\r\n\r\n  function describeCart(items) {\r\n    return items.map(function (item, index) {\r\n      var details = [String(index + 1) + '. ' + String(item.name)];\r\n      details.push('Quantity: ' + Math.max(1, Number(item.qty) || 1));\r\n      if (item.category) details.push('Category: ' + String(item.category));\r\n      if (item.partNumber) details.push('Part No.: ' + String(item.partNumber));\r\n      if (item.model) details.push('Model: ' + String(item.model));\r\n      return details.join(' | ');\r\n    }).join('\\n');\r\n  }\r\n\r\n  function setField(field, value) {\r\n    field.value = value;\r\n    field.dispatchEvent(new Event('input', { bubbles: true }));\r\n    field.dispatchEvent(new Event('change', { bubbles: true }));\r\n  }\r\n\r\n  function setStatus(drawer, text, error) {\r\n    var status = drawer.querySelector('.pie-quote-message');\r\n    if (!status) return;\r\n    status.className = 'pie-quote-message' + (error ? ' is-error' : '');\r\n    status.textContent = text;\r\n  }\r\n\r\n  function finishFailure(text) {\r\n    if (!pending) return;\r\n    var attempt = pending;\r\n    pending = null;\r\n    clearTimeout(attempt.timeout);\r\n    attempt.observer.disconnect();\r\n    attempt.button.disabled = false;\r\n    attempt.button.textContent = 'Send Quote Request';\r\n    setStatus(attempt.drawer, text || 'Request could not be sent. Your cart is still saved. Please try again.', true);\r\n  }\r\n\r\n  function finishSuccess() {\r\n    if (!pending) return;\r\n    var attempt = pending;\r\n    pending = null;\r\n    clearTimeout(attempt.timeout);\r\n    attempt.observer.disconnect();\r\n    var doc = attempt.doc;\r\n    var drawer = attempt.drawer;\r\n    \/\/ Use the cart's existing remove controls so its in-memory state and storage both update.\r\n    for (var count = 0; count < attempt.count; count++) {\r\n      var remove = doc.querySelector('.pie-quote-item .pie-quote-remove');\r\n      if (!remove) break;\r\n      remove.click();\r\n    }\r\n    var quoteForm = drawer.querySelector('.pie-quote-form');\r\n    if (quoteForm) quoteForm.reset();\r\n    var result = drawer.querySelector('.pie-quote-transmission');\r\n    if (result) {\r\n      result.hidden = false;\r\n      result.classList.remove('is-sending');\r\n      result.classList.add('is-success');\r\n      var title = result.querySelector('.pie-quote-transmission-success h3');\r\n      var intro = result.querySelector('.pie-quote-transmission-success p:not(.pie-quote-success-kicker)');\r\n      if (title) title.textContent = 'Request Sent!';\r\n      if (intro) intro.textContent = 'Your quote request has been submitted to JUWEI. We will reply to your email.';\r\n    }\r\n    if (quoteForm) quoteForm.hidden = true;\r\n    var heading = drawer.querySelector('.pie-quote-drawer-head h2');\r\n    if (heading) heading.textContent = 'Quote Request Sent';\r\n    attempt.button.disabled = false;\r\n    if (typeof drawer.scrollTo === 'function') drawer.scrollTo({ top: 0, behavior: 'smooth' });\r\n  }\r\n\r\n  function connectFrame(frame) {\r\n    var doc;\r\n    try { doc = frame.contentDocument; } catch (error) { return; }\r\n    if (!doc || !doc.querySelector('.pie-quote-form') || doc.__juweiQuoteBridgeConnected) return;\r\n    doc.__juweiQuoteBridgeConnected = true;\r\n    var drawer = doc.querySelector('.pie-quote-drawer');\r\n    var quoteForm = drawer.querySelector('.pie-quote-form');\r\n    var intro = quoteForm.querySelector(':scope > p');\r\n    var ownIntro = 'Enter your email and questions. JUWEI will reply by email: <a href=\"mailto:sales@jsjuwei.cn\">sales@jsjuwei.cn<\/a>.';\r\n    function updateContact() {\r\n      if (intro && intro.innerHTML !== ownIntro) intro.innerHTML = ownIntro;\r\n    }\r\n    updateContact();\r\n    new MutationObserver(updateContact).observe(quoteForm, { childList: true, subtree: true });\r\n\r\n    \/\/ Capture before the old cart script's submit handler; it targets another site's endpoint.\r\n    doc.addEventListener('submit', function (event) {\r\n      if (event.target !== quoteForm) return;\r\n      event.preventDefault();\r\n      event.stopImmediatePropagation();\r\n      if (pending) return;\r\n      setStatus(drawer, '', false);\r\n      if (!quoteForm.reportValidity()) return;\r\n      var fieldsRoot = document.getElementById('juwei-quote-form');\r\n      nativeForm = fieldsRoot && fieldsRoot.querySelector('form.elementor-form');\r\n      var email = nativeForm && nativeForm.querySelector('[name=\"form_fields[email]\"]');\r\n      var message = nativeForm && nativeForm.querySelector('[name=\"form_fields[message]\"]');\r\n      \/\/ The live JUWEI form labels this field \"Configuration\", but its current field ID is juwei_quote_form.\r\n      var config = nativeForm && nativeForm.querySelector('[name=\"form_fields[juwei_quote_form]\"], [name=\"form_fields[configuration]\"]');\r\n      if (!email || !message || !config) {\r\n        setStatus(drawer, 'Elementor form fields were not found. Check the Form widget field IDs: email, message, juwei_quote_form.', true);\r\n        return;\r\n      }\r\n      var items = readCart(frame.contentWindow);\r\n      if (!items.length) {\r\n        setStatus(drawer, 'Please add a product to the quote cart first.', true);\r\n        return;\r\n      }\r\n      setField(email, quoteForm.querySelector('[name=\"email\"]').value.trim());\r\n      setField(message, quoteForm.querySelector('[name=\"notes\"]').value.trim());\r\n      setField(config, describeCart(items));\r\n      if (!nativeForm.checkValidity()) {\r\n        setStatus(drawer, 'The Elementor form has another required field. Please remove unused fields such as Item #4.', true);\r\n        return;\r\n      }\r\n      var button = quoteForm.querySelector('.pie-submit-quote');\r\n      button.disabled = true;\r\n      button.textContent = 'Sending\u2026';\r\n      setStatus(drawer, 'Sending your request\u2026', false);\r\n      var observer = new MutationObserver(function () {\r\n        if (!pending) return;\r\n        var error = fieldsRoot.querySelector('.elementor-message-danger');\r\n        if (error) finishFailure(error.textContent.trim());\r\n        else if (fieldsRoot.querySelector('.elementor-message-success')) finishSuccess();\r\n      });\r\n      fieldsRoot.querySelectorAll('.elementor-message').forEach(function (oldMessage) { oldMessage.remove(); });\r\n      pending = {\r\n        doc: doc, drawer: drawer, button: button, count: items.length,\r\n        observer: observer,\r\n        timeout: setTimeout(function () {\r\n          finishFailure('No server confirmation received. Check Elementor \u2192 Submissions before trying again; your cart is still saved.');\r\n        }, 45000)\r\n      };\r\n      observer.observe(fieldsRoot, { childList: true, subtree: true, characterData: true });\r\n      try {\r\n        if (typeof nativeForm.requestSubmit === 'function') nativeForm.requestSubmit();\r\n        else nativeForm.querySelector('[type=\"submit\"]').click();\r\n      } catch (error) { finishFailure('The Elementor form could not be started. Your cart is still saved.'); }\r\n    }, true);\r\n  }\r\n\r\n  function init() {\r\n    var frame = findFrame();\r\n    if (!frame) return;\r\n    var receivingForm = document.querySelector('#juwei-quote-form form.elementor-form');\r\n    if (receivingForm && window.jQuery) {\r\n      window.jQuery(receivingForm).on('submit_success.juweiBridge', finishSuccess);\r\n    }\r\n    frame.addEventListener('load', function () { connectFrame(frame); });\r\n    connectFrame(frame);\r\n  }\r\n\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, { once: true });\r\n  else init();\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-62aac29 elementor-button-align-stretch elementor-widget elementor-widget-form\" data-id=\"62aac29\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"juwei-quote-form\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"JUWEI 3D Quote\" aria-label=\"JUWEI 3D Quote\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"36817\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"62aac29\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"\" \/>\n\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-100 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-email\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tEmail\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"email\" name=\"form_fields[email]\" id=\"form-field-email\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"Email\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-message\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tMessage\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[message]\" id=\"form-field-message\" rows=\"4\" placeholder=\"Message\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-configuration elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-configuration\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tConfiguration\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[configuration]\" id=\"form-field-configuration\" rows=\"4\" placeholder=\"Configuration\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Send<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-36817","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/pages\/36817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/comments?post=36817"}],"version-history":[{"count":54,"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/pages\/36817\/revisions"}],"predecessor-version":[{"id":37066,"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/pages\/36817\/revisions\/37066"}],"wp:attachment":[{"href":"https:\/\/www.juweihammer.com\/fr\/wp-json\/wp\/v2\/media?parent=36817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}